You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整Python正则表达式以正确拆分含方括号的公式字符串

问题:使用Python re模块正确拆分含方括号的表达式

需要拆分如下表达式:

formula = '(ABC**2+3/(DEF[4:6]-2*GHI[-5:-2]))'

拆分规则:以所有括号()及数学运算符(+、-、*、**、/)作为分隔符,但需区分减法运算的-与方括号内属于字符串索引的-,后者不触发拆分。

现有代码及问题:

import re

formula = '(ABC**2+3/(DEF[4:6]-2*GHI[-5:-2]))'

pattern = "[()+*/\-]"
split_expr = re.split(pattern, formula)

print(split_expr)

运行结果(方括号内的-被错误拆分):

['', 'ABC', '', '2', '3', '', 'DEF[4:6]', '2', 'GHI[', '5:', '2]', '', '']

期望输出(方括号内的-保留不拆分):

['', 'ABC', '', '2', '3', '', 'DEF[4:6]', '2', 'GHI[-5:-2]', '', '']

注:空字符串不是关键需求,可选择保留或过滤。


解决方案

调整正则表达式核心思路

要实现需求,需要:

  • 优先匹配**作为整体分隔符,避免拆分为单个*;
  • 确保所有待拆分的符号(括号、运算符)不在方括号[]内部。

使用负向先行断言和非捕获分组组合正则规则,最终模式为:

(?![^\[]*\])(?:\*\*|[()+*/-])

规则说明:

  • (?:\*\*|[()+*/-]):非捕获分组,优先匹配**,再匹配单个的括号/运算符;
  • (?![^\[]*\]):负向先行断言,确保当前匹配的位置不在方括号内部——即当前位置之后如果出现],必须先有对应的[,从而跳过方括号内的所有内容。

调整后代码及运行结果

import re

formula = '(ABC**2+3/(DEF[4:6]-2*GHI[-5:-2]))'

# 调整后的正则模式
pattern = r'(?![^\[]*\])(?:\*\*|[()+*/-])'
split_expr = re.split(pattern, formula)

print(split_expr)

运行结果:

['', 'ABC', '', '2', '3', '', 'DEF[4:6]', '2', 'GHI[-5:-2]', '', '']

可选:过滤空字符串

如果需要去除结果中的空字符串,可通过列表推导式处理:

filtered_expr = [item for item in split_expr if item]
print(filtered_expr)

输出:

['ABC', '2', '3', 'DEF[4:6]', '2', 'GHI[-5:-2]']

内容的提问来源于stack exchange,提问作者braunlee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:03:29