Python中如何按条件拆分数学公式减号,避免误拆列表内负号?
正则实现方案
针对你给出的公式场景,仅用正则即可完成拆分,核心逻辑是通过零宽负向断言排除方括号内的负号匹配,示例代码如下:
import re formula = "wa(A,[-126,-123,-120,-117,-114,-111,-108,-105,-102,-99,-96,-93,-90,-87,-84,-81,-78])-B-C-D" # 正则说明:(?<![\[,]) 匹配的运算符前不能是[或,,避免拆分列表内的负号 operands = re.split(r'(?<![\[,])[+\-*/]', formula) print(operands)
运行后输出结果完全符合你的预期:['wa(A,[-126,-123,-120,-117,-114,-111,-108,-105,-102,-99,-96,-93,-90,-87,-84,-81,-78])', 'B', 'C', 'D']
复杂场景手动遍历方案
如果你后续需要处理包含嵌套括号、多层列表、函数嵌套的复杂公式,正则无法覆盖所有边界情况,可使用手动遍历逻辑实现,代码示例如下:
def split_operands(formula): res = [] current = [] bracket_level = 0 for c in formula: if c in '([': bracket_level += 1 current.append(c) elif c in ')]': bracket_level -= 1 current.append(c) elif c in '+-*/' and bracket_level == 0: res.append(''.join(current)) current = [] else: current.append(c) if current: res.append(''.join(current)) return res # 测试 formula = "wa(A,[-126,-123,-120,-117,-114,-111,-108,-105,-102,-99,-96,-93,-90,-87,-84,-81,-78])-B-C-D" print(split_operands(formula))
该方案支持任意层级的括号嵌套,适配性更强。
内容的提问来源于stack exchange,提问作者Ramachandra Sai
相关产品推荐
相关产品推荐

