python: итерационная замена подстрок в строке

Подскажите как правильно выполнить итерационную замену подстрок в строке

Например из строки abcccccccccabcccccacccc заменой сс на c должно получиться abcabcac

Конечно можно сделать таким способом:

text = 'abcccccccccabcccccacccc'
while True:
    tmp = text.replace('cc', 'c')
    if tmp == text:
        text = tmp
        break
    text = tmp

но это все таки в лоб (поэтому длинно, медленно и грубо), есть ли более правильные и элегантные способы?

через регулярки тоже эффект не окончательный (может есть флаг, указывающий на итерационную замену?):

text = 'abcccccccccabcccccacccc'
text = re.sub(r'cc', 'c', text, flags=итерационный)

Ответы (2 шт):

Автор решения: strawdog

Можно так:

from itertools import groupby

text = 'abcccccccccabcccccacccc'
res = ''.join([x[0] for x in groupby(text)])

res:

'abcabcac'

Еще вариант:

text = 'abcccccccccabcccccacccc'

res = ([text[x] for x in range(len(text)-1) if text[x]!=text[x+1]])
res.append(text[-1])
print("".join(res))
'abcabcac'
→ Ссылка
Автор решения: GrAnd

А какая проблема сделать это регуляркой?
Если нужно убрать дубли буквы c:

import re
text = 'aaaabcccccccccabbbbcccccacccc'
text = re.sub(r'c+', 'c', text)
# aaaabcabbbbcac

Если нужно убрать дубли любых символов:

text = re.sub(r'(.)(\1)+', r'\1', text)
# abcabcac

Если в результате замены может образоваться строка, в которой тоже требуется замена, то придётся процесс замены повторить.

import re
text = 'xxxxxa'
n = True
while n: (text, n) = re.subn(r'xa', 'a', text)
# text = 'a'
→ Ссылка