正则表达式删除字符串中重复的字符模式

时间:2012-09-17 23:48:31

标签: python regex

我有一个可能有重复字符模式的字符串,例如

'xyzzyxxyzzyxxyzzyx'

我需要编写一个正则表达式,用最小的重复模式替换这个字符串:

'xyzzyxxyzzyxxyzzyx' becomes 'xyzzyx',

'abcbaccbaabcbaccbaabcbaccba' becomes 'abcbaccba'

4 个答案:

答案 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)