使用正则表达式查找字符串中最长的连续匹配

时间:2021-07-18 08:39:47

标签: python regex

我正在尝试使用正则表达式实现以下目标:

<块引用>

字符串 = "APPLEORANGEORANGEAPPLEAPPLEAPPLEAPPLEBANANABANANABANANAAPPLEBANANA"

如果匹配

<块引用>

re.compile = ["APPLE"]

输出应该是 3,因为这是最长的连续匹配。

意思是,我希望忽略其他两次不连续或不是最长连续批次的“APPLE”。如果只有单个、分隔的匹配项,则输出应为 1,因为没有一个是连续的。

我在文档中找不到任何只匹配连续结果的过滤器,抱歉,如果这是一个初学者问题并且我还没有意识到一个功能。

2 个答案:

答案 0 :(得分:1)

您应该查找字符串“APPLE”的一个或多个连续出现的所有匹配项,以下正则表达式将执行此操作:

(?:APPLE)+

See RegEx demo

然后按长度降序对它们进行排序。取最长的匹配项(即第一个匹配项)并除以 5('APPLE' 中的字符数),这将告诉您在最长匹配项中找到了多少次连续出现的 'APPLE':

import re

s = "APPLEORANGEORANGEAPPLEAPPLEAPPLEBANANABANANABANANAAPPLEBANANA"
matches = sorted(re.findall(r'(?:APPLE)+', s), reverse=True)
if matches:
    print(len(matches[0]) // 5)
else:
    print(0)

打印:

3

答案 1 :(得分:1)

Booboo 已经提供了一个最佳解决方案,但在我写这篇文章之前,我注意到我无论如何都会发布它。

import re

def get_max_consecutive_match_count(word, text):
  if word and text:
    pattern = re.compile(f'(?:{re.escape(word)})+')
    lengths = [m.end() - m.start() for m in re.finditer(pattern, text)]
    return max(lengths) // len(word) if lengths else 0

str = 'APPLEORANGEORANGEAPPLEAPPLEAPPLEBANANABANANABANANAAPPLEBANANA'

print(get_max_consecutive_match_count('APPLE', str))