Python 从给定模板生成文本
例如,我有一个字符串,如Python 从给定模板生成文本,python,string,random,Python,String,Random,例如,我有一个字符串,如 text = '{Hello|Good morning|Hi}{. We|, we} have a {good |best }offer for you.' 如何生成一组包含大括号中单词变体的所有可能字符串 你好。我们有一个很好的报价给你 早上好,我们有一个最好的报价给你 等等 您可以使用re和random模块,如下所示: import random import re def randomize(match): res = match.group(
text = '{Hello|Good morning|Hi}{. We|, we} have a {good |best }offer for you.'
如何生成一组包含大括号中单词变体的所有可能字符串
你好。我们有一个很好的报价给你
早上好,我们有一个最好的报价给你
等等
您可以使用
re
和random
模块,如下所示:
import random
import re
def randomize(match):
res = match.group(1).split('|')
random.shuffle(res)
return res[0]
def random_sentence(tpl):
return re.sub(r'{(.*?)}', randomize, tpl)
tpl = '{Hello|Good morning|Hi}{. We|, we} have a {good |best }offer for you.'
print(random_sentence(tpl))
我将使用树遍历方法获取所有可能的变量:
import re
text = '{Hello|Good morning|Hi}{. We|, we} have a {good |best }offer for you.'
variants = ['']
elements = re.split(r'([{\|}])',text)
inside = False
options = []
for elem in elements:
if elem=='{':
inside = True
continue
if not inside:
variants = [v+elem for v in variants]
if inside and elem not in '|}':
options.append(elem)
if inside and elem=='}':
variants = [v+opt for opt in options for v in variants]
options = []
inside = False
print(*variants,sep='\n')
输出:
Hello. We have a good offer for you.
Good morning. We have a good offer for you.
Hi. We have a good offer for you.
Hello, we have a good offer for you.
Good morning, we have a good offer for you.
Hi, we have a good offer for you.
Hello. We have a best offer for you.
Good morning. We have a best offer for you.
Hi. We have a best offer for you.
Hello, we have a best offer for you.
Good morning, we have a best offer for you.
Hi, we have a best offer for you.
说明:我使用re.split
将str拆分为元素:
['', '{', 'Hello', '|', 'Good morning', '|', 'Hi', '}', '', '{', '. We', '|', ', we', '}', ' have a ', '{', 'good ', '|', 'best ', '}', 'offer for you.']
然后,我在{
内部创建标记,如果我当前在{
和}
内部或外部,我将使用该标记进行存储,并相应地执行操作
- 如果我找到
{
我设置标志并转到下一个元素(继续
)
- 如果我不在括号内,我只需将给定元素添加到每个
变体
- 如果我在里面,元素不是
{
并且不是|
我会追加
将此元素添加到选项列表中
- 如果我在里面找到了
}
,那么我为每个
(变体之一)、(选项之一)的可能部分和
变体成为此操作的效果
请注意,我假设:始终正确的str
将作为文本提供,{
将仅用作控制字符,}
将仅用作控制字符,|
内{
}
将仅用作控制字符。但是如果文本大括号中有另一个大括号呢?例如,tpl={你好|早上好|你好{你好{我们{有一个{Good | best}为您提供。{Good | best}因为您使用大括号作为语法元素,建议您不要在里面使用大括号。您可以允许使用转义大括号,比如
,但是为了可靠地计算这样一个字符串,您需要一个lexer和一个解析器。