我有一个可能有重复字符模式的字符串,例如
'xyzzyxxyzzyxxyzzyx'
我需要编写一个正则表达式,用最小的重复模式替换这个字符串:
'xyzzyxxyzzyxxyzzyx' becomes 'xyzzyx',
'abcbaccbaabcbaccbaabcbaccba' becomes 'abcbaccba'
答案 0 :(得分:7)
使用以下内容:
> re.sub(r'(.+?)\1+', r'\1', 'xyzzyxxyzzyxxyzzyx')
'xyzzyx'
> re.sub(r'(.+?)\1+', r'\1', 'abcbaccbaabcbaccbaabcbaccba')
'abcbaccba'
> re.sub(r'(.+?)\1+', r'\1', 'iiiiiiiiiiiiiiiiii')
'i'
它基本匹配重复自身(.+?)\1+
的模式,并删除除第一组\1
中捕获的重复模式之外的所有模式。另请注意,在此处使用不情愿的限定符,即+?
将使正则表达式回溯相当多。
<强> DEMO 强>
答案 1 :(得分:4)
由于您需要最小的重复模式,因此以下内容适用于您:
re.sub(r'^(.+?)\1+$', r'\1', input_string)
^
和$
锚点确保您不会在字符串中间获得匹配,并且使用.+?
代替.+
,您将获得最短的模式(使用类似'aaaaaaaaaa'
的字符串比较结果。)
答案 2 :(得分:2)
尝试使用此正则表达式模式并捕获第一组:
^(.+?)\1+$
^
锚定字符串/行的开头.
除换行符之外的任何字符+
量词表示至少1次出现?
使+
懒惰而非贪婪,从而为您提供最短的模式()
抓捕小组\1+
使用量词反向引用表示该模式应该
$
锚点结束字符串/行在此测试:Rubular
上述解决方案会影响性能的大量回溯。如果你知道这些字符串中不允许哪些字符,那么你可以使用一个否定的characted集来消除回溯。例如,如果不允许空格,那么
^([^\s]+)\1+$
答案 3 :(得分:-1)
如何(使用re模块)写入功能,删除所有重复项。
import re
def remove_duplications(string):
return re.sub(r'(.+?)\1+', r'\1', string)