Рандомизация текста в 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 шт):
Если без вложенностей, то сама замена может уложиться в одну строчку.
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)