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

新手上路,请多包涵

例如:

我的字符串是: 123456789 nn nn oo nn nn mlm nn203

我的目标是: nn

然后,我从头到尾匹配字符串,并返回第一个匹配结果及其位置。

在这个例子中,结果是 nn 开始于[-5]结束于[-3]。

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

原文由 Aurel Vlaicu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
1 个回答

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

或者,将您的模式修改为只有最后一个匹配可能满足的模式:

 # since fixed width, you can use a lookbehind:
m=re.search(r'(...(?<=nn\d)(?!.*nn\d))',st)
if m: print(m.group(1))

或者,利用 .* 的贪心,它将始终返回多个匹配项中的最后一个:

 # .* will skip to the last match of nn\d
m=re.search(r'.*(nn\d)', st)
if m: print(m.group(1))

任何这些印刷品 nn5

原文由 dawg 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏