我确实调查了后向模式(?
输入:

aaaaaaGET(abc)aaaaaa
aaaaaaaaaaaaa
aaaaaMATCH(00)aaaaaaa
aaaaaaaaaaaaa
aaaaGEX(xyz)aaaaaa
aaaaaaGET(notneed)aaaaaa
aaaaaaGEX(no)aaaaaa
aaaaaaGET(nope)aaaaaa
aaaaaaGET(AbC)aaaaaa
aaaaaaaaaaaaa
aaaaaaaaaaaaa
aaaaaMATCH(01)aaaaaaa
aaaaaaaaaaaaa
aaaaGEX(XYz)aaaaaa


输出:

[(abc, 00, xyz), (AbC, 01, XYz]


我想使用re.findall查找所有MATCH部分,然后查找GET(在匹配项之上)和GEX(在匹配项之下)之后的内容,但是我不知道如何从后面获取类似内容。

如果我所有相关比赛都比MATCH提前,我会得到类似

re.findall('MATCH\((\d*)\).*?GEX\(([A-Za-z]*)\)', text, re.DOTALL)


但不确定如何获取并获得GET值

最佳答案

我想你想要这样的东西

>>> import re
>>> s = """aaaaaaGET(abc)aaaaaa
... aaaaaaaaaaaaa
... aaaaaMATCH(00)aaaaaaa
... aaaaaaaaaaaaa
... aaaaGEX(xyz)aaaaaa
... aaaaaaGET(notneed)aaaaaa
... aaaaaaGEX(no)aaaaaa
... aaaaaaGET(nope)aaaaaa
... aaaaaaGET(AbC)aaaaaa
... aaaaaaaaaaaaa
... aaaaaaaaaaaaa
... aaaaaMATCH(01)aaaaaaa
... aaaaaaaaaaaaa
... aaaaGEX(XYz)aaaaaa"""
>>> m = re.findall(r'GET.*?\(([^)]*)\)(?:(?!GET|GEX).)*?\(([^)]*)\)(?:(?!GET|GEX).)*?GEX\(([^)]*)\)', s, re.DOTALL)
>>> m
[('abc', '00', 'xyz'), ('AbC', '01', 'XYz')]


(?:(?!GET|GEX).)*否定的超前检查检查以下三个字符是否不是GETGEX,如果不存在,则仅匹配下一个字符。

关于python - Python/RegEx/findall:如何从比赛后面提取模式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25506988/

10-09 17:55