>>> 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 или более».