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

Python 使用正则表达式按任意顺序匹配两个单词,python,regex,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'), (

我已经花了一些时间学习正则表达式,但我仍然不明白下面的技巧是如何将两个单词按不同顺序进行匹配的

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

()

我知道
(?=.*)
部分称为
正向前瞻
,但在这种情况下它是如何工作的


有什么解释吗?

它只是不以任何任意顺序匹配。这里的捕获是由
*
完成的,它会消耗任何出现的东西。
正向前瞻
会做出断言。你有两个
lookahead
。它们彼此独立。每个都会做出一个单词的断言。因此,最后你的正则表达式工作原理如下:

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

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

3)
*
==如果断言已通过,则使用任何内容


你看,这里的顺序并不重要,重要的是,
断言应该通过

关于lookaheads的工作原理有很多解释。也许你应该读几本,而不是让我们为你再写一本。(换句话说:这是一个非常基本的问题,涉及到一个有很好的文档记录和解释的主题。我知道这个功能对于初学者来说不是很明显,但是在每一个可能的技术层面上都有解释。)我读过一些关于
积极前瞻
的教程,但我不记得有什么能解释这一点。你能给我提供一些有用的链接吗?谢谢,但是我已经读了几遍了。但仍然不知道它如何以任意顺序匹配。
*$
部分是不必要的@Aaron在那一页上,有一个类似于
的语句,它们不使用字符串中的字符,而只声明匹配是否可能。
谢谢vks,我有点开始理解它的意思了。@Aaron
声明是独立的。然后不要验证顺序。希望你不要对这里发生的事情感到困惑和清楚