1

大文字と小文字が混在する文字列があります。3 つの大文字で囲まれたすべての小文字を検索し、文字列から抽出する必要があります。

たとえば、前の文字列ZZZaZZZから を抽出したいとします。a

抽出できるが単独でZZZaZZZはないスクリプトを作成しました。aこれを行うにはネストされた正規表現を使用する必要があることはわかっていますが、これを実装する方法については頭に浮かびません。以下は私が持っているものです:

import string, re                                                                                                                                                                

if __name__ == "__main__":                                                                                                                                                       

    #open the file                                                                                                                                                               
    eqfile = open("string.txt")                                                                                                                                                
    gibberish = eqfile.read()                                                                                                                                                    
    eqfile.close()                                                                                                                                                               

    r = re.compile("[A-Z]{3}[a-z][A-Z]{3}")                                                                                                                                      
    print r.findall(gibberish)           

編集: 答えてくれてありがとう!もっと具体的に言うべきだったと思います。私の例のように、まったく同じ 3 つの大文字で囲まれている小文字を見つける必要がありますZZZaZZZ

4

3 に答える 3

5

あなたはとても近いです!.group* MatchObjectsのメソッドについて読んでください。たとえば、スクリプトが

r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")
print r.match(gibberish).group(1)

次に、最初のグループ内の目的のキャラクターをキャプチャします。

繰り返し文字を一致させるという新しい制約に対処するために、後方参照を使用できます。

r = re.compile(r'([A-Z])\1{2}(?P<middle>[a-z])\1{3}')
m = r.match(gibberish)
if m is not None:
    print m.group('middle')

次のようになります。

  1. 文字AZを一致させて覚えておいてください。
  2. 見つかった最初の文字の 2 つの出現に一致します。
  3. 小文字を一致させて、という名前のグループに保存しますmiddle
  4. 見つかった最初の文字のさらに 3 つの連続するインスタンスに一致します。
  5. 一致が見つかった場合は、middleグループの値を出力します。
于 2012-05-03T00:05:10.833 に答える
3

文字列の関心のある部分を括弧で囲んでキャプチャし、次のコマンドでアクセスする必要がありますre.MatchObject#group

r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")                                                                                                                                      
m = r.match(gibberish)
if m:
   print "Match! Middle letter was " + m.group(1)           
else:
   print "No match."
于 2012-05-03T00:09:27.547 に答える
3
r = re.compile("(?<=[A-Z]{3})[a-z](?=[A-Z]{3})") 

(?<=...)は肯定的な後読みを示し、肯定(?=...)的な先読みです。

モジュール再

(?=...)

... が次に一致する場合に一致しますが、文字列を消費しません。これは、先読みアサーションと呼ばれます。たとえば、が後に続く場合にのみIsaac (?=Asimov)一致します。'Isaac ''Asimov'

(?<=...)

文字列内の現在の位置の前に、現在の位置で終了する ... の一致がある場合に一致します。

于 2012-05-03T00:03:47.537 に答える