2013-05-14 5 views
1

Каков самый быстрый способ в Python заменить последовательность из 3 и более одинаковых символов в тексте utf-8? Мне нужно заменить последовательность из 3 и более одинаковых символов точными 2 символами. I.e.Заменить последовательность одинаковых символов

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

Ваш последний пример неправильно – jamylak

ответ

6

Вы можете использовать регулярное выражение:

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

шаблона захватывает любой символ следует такому же характер, повторяется два или более раз и соответствует этому подстроке. Замена заменяет подстроку с двумя буквами захваченного символа. Точка не заменит повторяющиеся новые строки, используйте (.|\n) или re.DOTALL флаг для этого.

Он работает с Unicode тоже:

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

И если у вас есть строка переменной x, содержащий UTF-8 текст, используйте x.decode('utf-8').

+0

Спасибо, исправил. –

+1

Было бы здорово, если бы downvoters вернулись бы однажды, а un-downvote, если проблема была решена. – glglgl

+1

@glglgl Я вернулся, и я поддержал это давным-давно – jamylak

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

Хотя для этого конкретного случая, я бы пойти на регулярное выражение, вы также могли бы сделать это общим для оператора на произвольные последовательности, например:

from itertools import groupby, chain, islice 

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