如何用Python正则为带X前缀的变量及括号内变量批量添加对应数字后缀
解决方案
原有方案的问题在于静态正则硬编码了括号内的变量数量,无法适配任意长度的组合。我们可以结合正则的回调替换功能,分优先级处理对应规则,具体实现如下:
import re def convert_logic_str(s): # 统计最长连续X的长度,确定遍历上限 max_x_count = max(len(m) for m in re.findall(r'X+', s)) if 'X' in s else 0 # 从最大X数量倒序处理,避免短X优先匹配拆分长X序列 for n in range(max_x_count, 0, -1): # 处理X在括号前的场景:匹配n个X + 任意嵌套括号块 def replace_bracket_vars(match): bracket_content = match.group(1) # 给括号内所有变量统一加_n后缀 return re.sub(r'([a-zA-Z]+[0-9]+)', rf'\1_{n}', bracket_content) # 递归匹配任意嵌套的括号块,适配多层括号场景 s = re.sub(rf'X{{{n}}}(\((?:[^()]|(?R))*\))', replace_bracket_vars, s) # 处理X直接修饰单个变量的场景 s = re.sub(rf'X{{{n}}}([~]*[a-zA-Z]+[0-9]+)', rf'\1_{n}', s) # 所有无X前缀的变量统一追加_0后缀 s = re.sub(r'([a-zA-Z]+[0-9]+)(?!_\d)', r'\1_0', s) return s # 测试示例 if __name__ == "__main__": input_s = 'g1 & g2 & (X~(~g1 & ~g2) & ~o1) & (XX~(~g1 & ~g2) & ~o1 & X~o1)' output_s = convert_logic_str(input_s) print(output_s) # 输出:'g1_0 & g2_0 & (~(~g1_1 & ~g2_1) & ~o1_0) & (~(~g1_2 & ~g2_2) & ~o1_0 & ~o1_1)'
适配说明
- 括号匹配使用了正则递归语法,支持任意层数的嵌套括号,不受括号内逻辑运算符类型、变量数量的限制,你提到的
XX(~g1 & ~g2 | ~k3)场景会自动转换为(~g1_2 & ~g2_2 | ~k3_2) - 倒序处理X数量可避免短X序列优先匹配,拆分长X序列的问题
- 最后一步的负向断言匹配可以确保已经加过后缀的变量不会被重复追加_0
内容的提问来源于stack exchange,提问作者GuyS
相关产品推荐
相关产品推荐

