如果您的输入相对简单——只有出现{
and}
是为了提供多个可能的文本片段,如问题所示——你可以使用如下的正则表达式:
import re
p = re.compile('(\{[^\}]+\}|[^\{\}]*)')
然后您将文本拆分为如下片段:
frags = p.split("{Foo|Bar} baz {quux|wibble}.")
# ['', '{Foo|Bar}', '', ' baz ', '', '{quux|wibble}', '', '.', '']
对于此列表中的每个字符串,您可以生成一个可能值列表(只有一个用于不以 开头的字符串{
):
def options(s):
if len(s) > 0 and s[0] == '{':
return [opt for opt in s[1:-1].split('|')]
return [s]
options("foo")
# ["foo"]
options("{foo|bar}")
# ["foo", "bar"]
然后建立一个选项列表列表:
opt_lists = [options(frag) for frag in frags]
然后构建笛卡尔积并加入:
import itertools
for spec in itertools.product(*opt_lists):
print(''.join(spec))
这是"{Foo|Bar} baz {quux|wibble}."
示例的输出:
Foo baz quux.
Foo baz wibble.
Bar baz quux.
Bar baz wibble.
如果您的输入中有额外的复杂性,您可能需要对实际输入格式使用更复杂的正则表达式或解析器,但生成选项列表作为中间结果的一般想法仍然有效。