Python / RegEx / findall:如何从匹配后面提取模式?

时间:2014-08-26 13:24:44

标签: python regex

我确实调查了lookbehind模式(?< = ...)但这似乎没有保存匹配。

输入:

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值

1 个答案:

答案 0 :(得分:4)

我想你想要这样的东西,

>>> 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,如果不存在,则只检查下一个字符。