入力が比較的単純な場合 (質問に示されているように、複数の可能性のあるテキスト フラグメントを提供する目的でのみ{
とが出現する場合)、次のような正規表現を使用できます。}
import re
p = re.compile('(\{[^\}]+\}|[^\{\}]*)')
次に、テキストを次のようにフラグメントに分割します。
frags = p.split("{Foo|Bar} baz {quux|wibble}.")
# ['', '{Foo|Bar}', '', ' baz ', '', '{quux|wibble}', '', '.', '']
このリストの文字列ごとに、可能な値のリストを生成できます ( で始まらない文字列に対して 1 つだけ{
)。
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.
入力がさらに複雑な場合は、実際の入力形式に対してより複雑な正規表現またはパーサーを使用する必要があるかもしれませんが、オプションのリストのリストを中間結果として生成するという一般的な考え方は有効です。