我想提取一个最长的重复字符串。
这就是我所做的:
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”,因为第一个捕获组可以是一个空字符串。
答案 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'