如何从含变体花括号的模板生成全部可能字符串?
生成花括号变体组合的所有可能字符串
这问题我之前做类似需求时碰到过,核心就是把每个花括号里的选项拆出来,做笛卡尔积组合就行,用Python实现起来特别顺手。
思路拆解
先理清楚输入字符串的结构:
- 被
{}包裹的是一组可选文本,用|分隔不同选项 - 其他部分都是固定不变的文本
解决步骤很清晰:
- 把字符串拆分成「固定文本段」和「选项组」两部分
- 将每个选项组拆成独立的选项列表
- 计算所有选项组的笛卡尔积(也就是所有可能的选项组合)
- 把每个组合和固定文本段拼接,生成最终的所有字符串
代码实现
我写了一段Python代码,直接就能处理你给的示例:
import re from itertools import product def generate_all_combinations(text): # 用正则匹配所有{...}格式的选项组 pattern = re.compile(r'{([^}]+)}') parts = [] last_pos = 0 # 遍历所有匹配到的选项组,拆分固定文本和选项 for match in pattern.finditer(text): # 添加两个选项组之间的固定文本 parts.append(text[last_pos:match.start()]) # 拆分选项组为列表,可选:去掉选项里的多余空格 options = [opt.strip() for opt in match.group(1).split('|')] parts.append(options) last_pos = match.end() # 添加最后一段固定文本 parts.append(text[last_pos:]) # 生成所有选项组合的笛卡尔积 option_groups = [p for p in parts if isinstance(p, list)] for combo in product(*option_groups): # 拼接固定文本和当前选项组合 result = [] combo_idx = 0 for part in parts: if isinstance(part, str): result.append(part) else: result.append(combo[combo_idx]) combo_idx += 1 yield ''.join(result) # 测试你的示例输入 text = '{Hello|Good morning|Hi}{. We|, we} have a {good |best }offer for you.' for idx, s in enumerate(generate_all_combinations(text), 1): print(f"{idx}. {s}")
代码说明
- 正则
r'{([^}]+)}'专门匹配{}包裹的内容,[^}]确保不会跨花括号匹配,避免解析错误 itertools.product用来生成所有选项组的笛卡尔积,比如你的示例有3、2、2个选项,最终会生成3×2×2=12种组合- 代码里的
strip()是为了清理选项里的多余空格,如果你想保留原始空格(比如{good |best }里的末尾空格),删掉这一行就行
输出示例
运行代码后会输出你提到的示例,比如:
- Hello. We have a good offer for you.
- Hello. We have a best offer for you.
- Hello, we have a good offer for you.
- Hello, we have a best offer for you.
...(剩下的8种组合会依次输出)
注意事项
如果你的需求里出现嵌套花括号(比如{Hello|Hi {there|guy}}),上面的正则就不够用了,需要用递归或者更复杂的解析逻辑。不过从你的示例来看,平级花括号用这段代码完全没问题。
内容的提问来源于stack exchange,提问作者0xdeaddead
相关产品推荐
相关产品推荐

