python - 如何使用正则表达式找到最短的重叠匹配?

标签 python regex

我对正则表达式还是比较陌生。我试图找到与特定模式匹配的最短文本字符串,但如果最短模式是较大匹配项的子字符串,我就会遇到麻烦。例如:

import re
string = "A|B|A|B|C|D|E|F|G"
my_pattern = 'a.*?b.*?c'

my_regex = re.compile(my_pattern, re.DOTALL|re.IGNORECASE)
matches = my_regex.findall(string)

for match in matches:
    print match

打印:

A|B|A|B|C

但我希望它返回:

A|B|C

有没有一种方法可以做到这一点而不必遍历每个匹配项来查看它是否包含匹配的子字符串?

最佳答案

与此处的大多数其他答案相反,这可以使用 positive lookahead assertion 在单个正则表达式中完成用capturing group :

>>> my_pattern = '(?=(a.*?b.*?c))'
>>> my_regex = re.compile(my_pattern, re.DOTALL|re.IGNORECASE)
>>> matches = my_regex.findall(string)
>>> print min(matches, key=len)
A|B|C

findall() 将返回所有可能的匹配项,因此您需要 min() 来获得最短的匹配项。

这是如何工作的:

  • 我们不匹配此正则表达式中的任何文本,仅匹配字符串中的位置(正则表达式引擎在匹配尝试期间逐步执行)。
  • 在每个位置,正则表达式引擎都会提前查看您的正则表达式是否会匹配该位置。
  • 如果是,它将被捕获组捕获。
  • 如果没有,就不会。
  • 在任何一种情况下,正则表达式引擎都会前进一个字符并重复该过程,直到字符串结束。
  • 由于先行断言不消耗任何字符,因此将找到所有重叠的匹配项。

关于python - 如何使用正则表达式找到最短的重叠匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148700/

相关文章:

python - VSCode : Remote debugging configuration suddenly not working anymore

python - 在 numpy 数组上并行化区域计算

python - 如何减小 5 层 for 循环的大小

php - 查找以非字母符号开头的行

python - 优化程序的可变变量

python - 如何在python中添加回车?

Python 正则表达式语句未返回正确的结果

regex - 递归列出包含 m of n 正则表达式的文件

Java正则表达式预定义字符类?

javascript - Node : RegExp returns nothing