我正在尝试使用正则表达式实现以下目标:
<块引用>字符串 = "APPLEORANGEORANGEAPPLEAPPLEAPPLEAPPLEBANANABANANABANANAAPPLEBANANA"
如果匹配
<块引用>re.compile = ["APPLE"]
输出应该是 3,因为这是最长的连续匹配。
意思是,我希望忽略其他两次不连续或不是最长连续批次的“APPLE”。如果只有单个、分隔的匹配项,则输出应为 1,因为没有一个是连续的。
我在文档中找不到任何只匹配连续结果的过滤器,抱歉,如果这是一个初学者问题并且我还没有意识到一个功能。
答案 0 :(得分:1)
您应该查找字符串“APPLE”的一个或多个连续出现的所有匹配项,以下正则表达式将执行此操作:
(?:APPLE)+
然后按长度降序对它们进行排序。取最长的匹配项(即第一个匹配项)并除以 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))