我花了一些时间学习正则表达式,但我仍然不明白以下技巧如何用于以不同顺序匹配两个单词。
import re
reobj = re.compile(r'^(?=.*?(John))(?=.*?(Peter)).*$',re.MULTILINE)
string = '''
John and Peter
Peter and John
James and Peter and John
'''
re.findall(reobj,string)
结果
[('John', 'Peter'), ('John', 'Peter'), ('John', 'Peter')]
(https://www.regex101.com/r/qW4rF4/1)
我知道(?=.* )
部分名为Positive Lookahead
,但在这种情况下它是如何工作的?
有任何解释吗?
答案 0 :(得分:1)
它只是在任意顺序中都不匹配。这里的捕捉是由.*
完成的,它消耗了任何相应的东西。positive lookahead
作出断言。你有两个lookaheads
他们彼此独立。每个人都断言一个词。所以最后你的正则表达式如下:
1)(?=.*?(John))
===字符串应该有一个John
。只是一个断言。不消耗任何东西
2)(?=.*?(Peter))
===字符串应该有一个Peter
。只是一个断言。不消耗任何东西
3).*
===如果断言已经过去,那就消耗任何东西
所以你看到这里的顺序无关紧要,那就是assertions should pass
。