Python 如何使用正则表达式做反向搜索?

Python 如何使用正则表达式做反向搜索?,python,regex,search,reverse,Python,Regex,Search,Reverse,例如: 我的字符串是:123456789 nn oonn nn mlm nn203 我的目标是:nn 然后,我将字符串从头到尾进行匹配,并返回第一个匹配结果及其位置。 在本例中,结果是nnstart In[-5]end In[-3]。 我写了一个简单的函数来完成这个过程,但是如何使用正则表达式来完成这项工作呢?首先,如果你不是在寻找正则表达式,string.rfind更容易正确 您可以通过使用负前瞻来使用正则表达式,请参阅以下文档: 对于字符串本身,只需执行findall并使用最后一个: imp

例如:
我的字符串是:
123456789 nn oonn nn mlm nn203

我的目标是:
nn

然后,我将字符串从头到尾进行匹配,并返回第一个匹配结果及其位置。
在本例中,结果是
nn
start In[-5]end In[-3]。

我写了一个简单的函数来完成这个过程,但是如何使用正则表达式来完成这项工作呢?

首先,如果你不是在寻找正则表达式,
string.rfind
更容易正确

您可以通过使用负前瞻来使用正则表达式,请参阅以下文档:


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

想法:

  • 在反转字符串中查找反转的regexp(在您的情况下是不相关的)
  • 结果索引将转换为负数+开关开始
例如:

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

HM,如果搜索项是“NA”,您希望它在字符串中匹配正向还是反向(即匹配人或名称)?这里有一些类似于您的代码的代码,许多代码可能会更可读:(注意,代码>搜索/代码>在循环结束后确实存在。)在我给出的链接中,如果没有得到任何结果,则会出错。我建议在这里使用re.DOTALL标志,因为默认情况下,(点字符)不包括换行符。
>>> import re
>>> s = "123456789 nn nn oo nn nn mlm nn203"
>>> m = re.search("(nn)", s[::-1])
>>> -m.end(), -m.start()
(-5, -3)