替换相同字符的序列

时间:2013-05-14 12:25:03

标签: python regex text

在utf-8文本中用Python替换3个和更多相同字符序列的最快方法是什么?我需要用2个字符替换3个以上相同字符的序列。 即

aaa -> aa 
bbbb -> bb
abbbcd -> abbcd
124xyyyz3 -> 124xyyz3

3 个答案:

答案 0 :(得分:12)

>>> import re
>>> re.sub(r'(\w)\1{2,}', r'\1\1', 'aaa')
'aa'
>>> re.sub(r'(\w)\1{2,}', r'\1\1', 'bbbb')
'bb'

答案 1 :(得分:6)

您可以使用正则表达式:

import re
re.sub(r'(.)\1{2,}', r'\1\1', 'bbbbbaaacc')

Pattern捕获任何字符后跟相同的字符重复两次或更多次并匹配此子字符串。替换只用两个捕获的字符替换匹配的子字符串。 Dot不会替换重复的新行,请使用(.|\n)re.DOTALL标记。

它也适用于Unicode:

re.sub(r'(.)\1{2,}', r'\1\1', u'жжж')

如果您的字符串变量x包含utf-8文本,请使用x.decode('utf-8')

答案 2 :(得分:1)

虽然对于这个特定的情况我会寻找正则表达式,你也可以在任意序列上使这个泛型为运算符,例如:

from itertools import groupby, chain, islice

s = 'abaaaaaabbbbbbbbcdcddddde'
print ''.join(chain.from_iterable(islice(g, 2) for k, g in groupby(s)))
# abaabbcdcdde