我确实调查了后向模式(?
输入:
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).)*
否定的超前检查检查以下三个字符是否不是GET
或GEX
,如果不存在,则仅匹配下一个字符。关于python - Python/RegEx/findall:如何从比赛后面提取模式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25506988/