Не используйте RE для этого.RE хороши для поиска, сопоставления и преобразования, но не для генерации строк.
Мы можем рассматривать строку как вектор;каждая буква - это измерение, а количество повторений - это длина компонента вдоль этого измерения.Для данного вектора V вам нужны все возможные векторы того же измерения, что и V, так что значение каждого компонента равно 1, если соответствующий компонент V равен 1, или равно 1 или 2 в противном случае.Исходя из этого, вот функция, которая делает то, что вы хотите.
def doppelstring(s):
letter_groups = ((val, list(group)) for val, group in itertools.groupby(s))
max_vector = ((val, min(len(group), 2)) for val, group in letter_groups)
vector_components = ([dim * (l + 1) for l in range(maxlen)] for dim, maxlen in max_vector)
return [''.join(letters) for letters in itertools.product(*vector_components)]
Вот более компактная версия, которая использует нарезку.Он может быть немного менее читабельным, но, по крайней мере, не выходит за предел в 78 символов:
def doppelstring(s):
max_vs = (''.join(itertools.islice(g, 2)) for k, g in itertools.groupby(s))
components = ([s[:l + 1] for l in range(len(s))] for s in max_vs)
return [''.join(letters) for letters in itertools.product(*components)]