使用正则表达式以任意顺序匹配两个单词

时间:2015-04-06 10:04:33

标签: python regex

我花了一些时间学习正则表达式,但我仍然不明白以下技巧如何用于以不同顺序匹配两个单词

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')]

enter image description here

https://www.regex101.com/r/qW4rF4/1

我知道(?=.* )部分名为Positive Lookahead,但在这种情况下它是如何工作的?

有任何解释吗?

1 个答案:

答案 0 :(得分:1)

它只是在任意顺序中都不匹配。这里的捕捉是由.*完成的,它消耗了任何相应的东西。positive lookahead作出断言。你有两个lookaheads他们彼此独立。每个人都断言一个词。所以最后你的正则表达式如下:

1)(?=.*?(John)) ===字符串应该有一个John。只是一个断言。不消耗任何东西

2)(?=.*?(Peter)) ===字符串应该有一个Peter。只是一个断言。不消耗任何东西

3).* ===如果断言已经过去,那就消耗任何东西

所以你看到这里的顺序无关紧要,那就是assertions should pass