如何使用正则表达式进行反向搜索?

时间:2013-05-12 17:13:34

标签: python regex search reverse

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

然后,我匹配从结尾到开头的字符串,并返回第一个匹配结果及其位置 在此考试中,结果是nn在[ - 3]中以[ - 3]开头 我写了简单的funcitonto做这个过程,但是如何使用正则表达式来完成这个工作呢?

3 个答案:

答案 0 :(得分:11)

对于字符串本身,只需执行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

答案 1 :(得分:4)

首先,如果你不是在寻找正则表达式,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)

答案 2 :(得分:3)

想法:

  • 在反向字符串中找到反向正则表达式(在您的情况下无关紧要)
  • 结果索引转换为负数+开关开始​​< - >结束

示例:

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