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

问题描述 投票:0回答:4

例如:
我的字符串是:

123456789  nn  nn  oo nn  nn mlm nn203
.
我的目标是:
nn

然后,我从末尾到开头匹配字符串,并返回第一个匹配结果及其位置。
在此示例中,结果为

nn
开始于 [-5] 结束于 [-3]。
我写了一个简单的函数来完成这个过程,但是如何使用正则表达式来完成这个工作呢?

python regex search reverse
4个回答
21
投票

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


7
投票

首先,如果您不是在寻找正则表达式,

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)

5
投票

想法:

  • 在反向字符串中查找反向正则表达式(在您的情况下不相关)
  • 结果索引转换为负数+切换start<->end

示例:

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

0
投票

正则表达式有两个特殊符号:^和$

 tx = "hello .... ok"

 # ^ forces the search from beginning
 /^.*[o].*/   will find in hello

 # $ forces the search at the END 
 /.*[o].*$/   will match from ok

同时使用两者仅匹配整个字符串

© www.soinside.com 2019 - 2024. All rights reserved.