我花了一些时间学习正则表达式,但我仍然不明白以下技巧如何以不同顺序匹配两个单词。
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
,但它在这种情况下如何工作?
有什么解释吗?
最佳答案
它只是不以任何任意顺序匹配。这里的捕获是由 .*
完成的,它会消耗任何到达它的方式。positive lookahead
做出断言。你有两个 lookaheads
。它们彼此独立。每个断言一个词。所以最后你的正则表达式的工作方式如下:
1)(?=.*?(John))
===String 应该有一个John
。只是一个断言。不消耗任何东西
2)(?=.*?(Peter))
===String应该有一个Peter
。只是一个断言。不消耗任何东西
3).*
===如果断言通过则消费任何东西
所以你看这里的顺序并不重要。重要的是断言应该通过
。
关于python - 使用正则表达式以任意顺序匹配两个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29469084/