Рандомизация текста в python

Я пытаюсь сделать рандомизацию текста на python. Используя набросок из вопроса написала такой код:

def get_random_choice(text):
    return random.choice(text)

message = "{привет|здоров|здравствуйте|приветсвую} {вас|тебя}, как твои {дела|делишки}"
matches = re.findall("{(.*?)}", message)

all_mathces = []
for match in matches:
    all_mathces.append(match.split('|'))

res_text = ''
for match in all_mathces:
    res_text += get_random_choice(match) + ' '

print(res_text)

# Output: здравствуйте вас делишки 

Через регулярное выражение я получаю все значения в фигурных скобках и далее работаю с ними, вопрос в том как потом объединить рандомизированный текст с другими словами? Через регулярное выражение получить всё, что не в фигурных скобках и затем как-то формировать итоговую строку по индексами двух массивов (рандомно полученных слов и обычных)?

И насколько реальном данным методом обрабатывать строки с вложенными {}, т.е. {|{|}}, например:

message = "Hello {beautiful|{{very|slightly} |}{good|bad|neutral}} World{{?|!?}|!}"

В общем правильный ли я использую подход или это лучше делать посимвольным перебором строки, как в вопросе?

Хотелось бы услышать мнения по коду и в целом по данной задаче. Возможно мой код слишком громоздкий и это можно сделать намного проще или есть подобные библиотеки на python, потому что я их не нашла. Буду благодарна за любую помощь.


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

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

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

import random, re

s = "{привет|здоров|здравствуйте|приветствую} {вас|тебя}, как твои {дела|делишки}"
res = re.sub(r"{(.+?)}", lambda x: random.choice(x.group(1).split("|")), s)
print(res)

С вложенными скобочками можно в цикле тем же самым регекспом последовательно подстановкой от внутренних скобочек до внешних.

import random, re

message = "Hello {beautiful|{{very|slightly} |}{good|bad|neutral}} World{{?|!?}|!}"
while "{" in message:
    message = re.sub(r"{([^{}]+)}", lambda x: random.choice(x.group(1).split("|")), message)
print(message)

Или так (чтобы не зациклилось до бесконечности если на входе некорректная с точки зрения парности скобочек строка).

import random, re

message = "Hello {beautiful|{{very|slightly} |}{good|bad|neutral}} World{{?|!?}|!}"
n = True
while n:
    message, n = re.subn(r"{([^{}]+)}", lambda x: random.choice(x.group(1).split("|")), message)
print(message)
→ Ссылка