2013-05-12 87 views
7

例如:
我的字符串是:123456789 nn nn oo nn nn mlm nn203
我的目標是:nn如何使用正則表達式進行反向搜索?

然後,我匹配從結尾到開頭的字符串,並返回第一個匹配結果及其位置。
在這個例子中,結果是nn在[-5]結尾在[-3]中開始。
我寫了簡單的funcitonto做這個過程,但是如何使用正則表達式來完成這個工作?

+0

嗯,如果搜索term是'na',你想讓它匹配字符串中的前進還是後退(即匹配人或姓名)? – 2013-05-12 17:18:13

回答

2

首先,如果你不想尋找一個正則表達式,string.rfind要容易得多。

您可以通過使用負先行使用正則表達式,見re文檔:

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

對於字符串本身,只是做的findall和使用最後一個:

import re 

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

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

打印nn5

您也可以使用finditer做同樣的事情,這使得更容易找到重新東昇指標:

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

打印('nn5', 27, 30)

如果你有很多比賽,你只需要最後的,有時是有意義的只是扭轉字符串和模式:

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

打印nn5

+0

這裏有一些類似於你的代碼的東西,很多人可能會認爲它更具可讀性:http://pastebin.com/J7SsXjsS(請注意,循環完成後''search'確實存在。) – Shule 2014-09-18 01:24:37

+0

在我給出的鏈接中,你會得到一個錯誤如果你沒有得到任何結果,但(所以一定要處理它)。 – Shule 2014-09-18 02:01:25

2

理念:

  • 找到逆轉串逆轉的正則表達式(在你的案件無關)
  • 導致指標轉換爲負數+開關啓動< - >結束

例子:

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