gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:06:43 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com