Python正则表达式:最长重复

时间:2019-05-31 22:10:21

标签: python regex

我想提取一个最长的重复字符串。

这就是我所做的:

import re

def search_longest_repeat(str1):
   m = re.match(r'^(\w*?)((\w+)\3+)(\w*?)$', str1)
   return m.groups()[1]


while True:
   s = raw_input("Input a string: ")
   if not s:
      break
   print(search_longest_repeat(s)

上面的代码对于这些单词很有效:

bcdcdecdcdef cdcdecdcdef acdecde

但是它不适用于“ aacdacd”。 输出“ aa”。 我想要的是“ acdacd”

Input a string: bcdcdecdcdef
cdcdecdcde
Input a string: cdcdecdcdef
cdcdecdcde
Input a string: acdecde
cdecde
Input a string: aacdacd
aa

如何修改我的正则表达式? 这是我最初的想法:

第一个捕获组为零个或多个字符且非贪婪

第二个捕获组是一个或多个字符且贪婪

第四个捕获组是零个或多个字符且不贪心

使用我的正则表达式r'^(\ w *?)((\ w +)\ 3 +)(\ w *?)', 第二个捕获组捕获最长的重复“ aa”,因为第一个捕获组可以是一个空字符串。

1 个答案:

答案 0 :(得分:1)

可以使用正向前行来逐步推进捕获组,以便在匹配aa时留下第二个“ a”以与“ acd”匹配。

运行正则表达式:

M = re.findall('(?=((\w+)\\2+))', 'aacdacd')
>>> M
[('aa', 'a'), ('acdacd', 'acd')]

要获得最长的匹配,可以使用它。

>>> maxx = max([j for i in M for j in i], key = len)
>>> maxx
'acdacd'