簡體   English   中英

如何使用正則表達式進行反向搜索?

[英]How to use regular expressions do reverse search?

例如:
我的字符串是: 123456789 nn nn oo nn nn mlm nn203
我的目標是: nn

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

對於字符串本身,只需執行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

首先,如果您不尋找正則表達式,則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)

理念:

  • 在反向字符串中查找反向正則表達式(在您的情況下不相關)
  • 結果索引轉換為負數+切換開始<->結束

例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM