Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从给定模板生成文本_Python_String_Random - Fatal编程技术网

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和一个解析器。