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'