2013-05-12 8 views
7

例:
私の文字列は123456789 nn nn oo nn nn mlm nn203です。
ターゲットはnnです。正規表現を使用して逆の検索を行う方法はありますか?

次に、最初から最後までの文字列と一致し、最初の一致結果とその位置を返します。
結果はnnで、[ - 3]の[-5]末尾に始まります。
私は単純なfuncitontoこのプロセスを行うが、この仕事を行うために正規表現を使用する方法を書いた?

+0

フム、検索した場合にタームは 'na'だったので、文字列(つまり、男または名前にマッチする)の前または後ろに一致させたいですか? –

答えて

2

最初に、正規表現を探していない場合は、string.rfindの方がはるかに簡単です。最後の1だけのfindAllを行い、文字列自体については

import re 
s = "123456789 nn nn oo nn nn mlm nn203" 
match = re.search("(nn)(?!.*nn.*)", s) 

# for your negative numbers: 
print (match.start()-len(s), match.end()-len(s)) 
# (-5, -3) 
10

と使用::

あなたは否定先読みを使用して、正規表現を使用することができ、reのマニュアルを参照してください

import re 

st='123456 nn1 nn2 nn3 nn4 mlm nn5 mlm' 

print re.findall(r'(nn\d+)',st)[-1] 

プリントnn5

finditerを使用して同じことをすることもできますレバントインデックス:

m=re.search(r'(\d+nn)',st[::-1]) 
offset=m.start(1) 
print st[-m.start(1)-len(m.group(1)):-m.start(1)] 

プリント:

print [(m.group(),m.start(),m.end()) for m in re.finditer(r'(nn\d+)',st)][-1] 

プリント('nn5', 27, 30)

あなたは試合の多くを持っていて、最後にしたい場合は、時にはそれは単に文字列とパターンを逆にする意味がありますnn5

+0

ここには、多くの人が読みやすいと考えるかもしれないコードに似たものがあります:http://pastebin.com/J7SsXjsS(ループが終了した後に 'search'が存在することに注意してください) – Shule

+0

私が与えたリンクでは、ただし、結果が得られない場合はエラーとなります(したがって、必ず処理してください)。 – Shule

2

アイデア:

  • インデックスの結果
  • 逆に文字列に(あなたの場合は無関係な)逆に正規表現を見つける<開始切り替える+負の数に変換 - >終わり

例:

>>> import re 
>>> s = "123456789 nn nn oo nn nn mlm nn203" 
>>> m = re.search("(nn)", s[::-1]) 
>>> -m.end(), -m.start() 
(-5, -3) 
関連する問題