假设我想使用正则表达式删除字符串中所有重复的字符(特定字符)。这很简单 -
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)算法更好地解决,但我想使用正则表达式来探索这个
答案 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['