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

标签 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,但它在这种情况下如何工作?

有什么解释吗?

最佳答案

它只是不以任何任意顺序匹配。这里的捕获是由 .* 完成的,它会消耗任何到达它的方式。positive lookahead 做出断言。你有两个 lookaheads 。它们彼此独立。每个断言一个词。所以最后你的正则表达式的工作方式如下:

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

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

3).*===如果断言通过则消费任何东西

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

关于python - 使用正则表达式以任意顺序匹配两个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29469084/

相关文章:

python - 如何将一系列元组转换为 Pandas 数据框?

python - 用于查找星号的正则表达式(仅当不被数字包围时)

javascript - 使用 JavaScript 正则表达式的条件渲染

python - 将一维掩码数组表示为切片列表

python - matplotlib:如何制作一个覆盖下面内容的不透明填充区域?

python - 重命名子图中的图例 : matplotlib

java - 如何检查字节数组是否包含 Java 中的 Unicode 字符串?

javascript - 带撇号的正则表达式单词搜索

Python:函数返回的值未在 Pandas 数据框中更新

python - 我怎样才能从 BeautifulSoup 中获取 CData