使用正则表达式删除重复的字符?

时间:2011-01-01 15:26:22

标签: python regex string

假设我想使用正则表达式删除字符串中所有重复的字符(特定字符)。这很简单 -

import re
re.sub("a*", "a", "aaaa") # gives 'a'

如果我想用相应的char替换所有重复的字符(即a,z),该怎么办?我该怎么做?

import re
re.sub('[a-z]*', <what_to_put_here>, 'aabb') # should give 'ab'
re.sub('[a-z]*', <what_to_put_here>, 'abbccddeeffgg') # should give 'abcdefg'

注意:我知道删除重复方法可以使用哈希表或一些O(n ^ 2)算法更好地解决,但我想使用正则表达式来探索这个

3 个答案:

答案 0 :(得分:41)

>>> import re
>>> re.sub(r'([a-z])\1+', r'\1', 'ffffffbbbbbbbqqq')
'fbq'

()周围的[a-z]指定捕获组,然后指定\1反向引用)模式和替换是指第一个捕获组的内容。

因此,正则表达式读取“找到一个字母,然后是一个或多个同一个字母的出现”,然后将整个找到的部分替换为找到的一个字母。

旁注......

a的示例代码实际上是错误的:

>>> re.sub('a*', 'a', 'aaabbbccc')
'abababacacaca'

您真的希望将'a+'用于正则表达式而不是'a*',因为*运算符与“0或更多”匹配项匹配,因此将匹配两个之间的空字符串非a字符,而+运算符匹配“1或更多”。

答案 1 :(得分:1)

如果您还想删除非连续出现的重复项,则必须将内容包装在循环中,例如:像这样

 s="ababacbdefefbcdefde"

 while re.search(r'([a-z])(.*)\1', s):
     s= re.sub(r'([a-z])(.*)\1', r'\1\2', s)

 print s  # prints 'abcdef'

答案 2 :(得分:-1)

包括所有类别的解决方案:

re.sub(r'(.)\1+', r'\1', 'aaaaabbbbbb[[[[[')

给予:

'ab['