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

如何在Python3.8中用正则提取==运算符两侧的操作数?

解决==两侧嵌套表达式的正则匹配问题

我明白你遇到的问题了——原来的正则因为没有覆盖表达式中的运算符和空格,导致没法完整匹配带嵌套括号且包含运算的内容。让我给你拆解一下问题,并给出可行的解决方案。

问题根源

你原来的正则表达式((?:\((?:[^\(\)]|(?R))*\)|[\w\.])+)\s*==\s*((?:\((?:[^\(\)]|(?R))*\)|[\w\.])+)有个关键局限:它只允许匹配「完整嵌套括号结构」或者「仅包含字母、数字、下划线、点的标识符」,但实际表达式里的运算符(比如*、+、-)和空格都不在匹配范围内。当遇到这些字符时,匹配就会中断,自然没法覆盖像(num1 * ( 2 + num2))这样的完整表达式。

修正后的正则表达式

针对Python 3.8的regex库,我们需要扩展匹配范围,允许表达式中包含合法的运算符、空格,同时保留递归匹配嵌套括号的能力。修正后的正则如下:

r'(\((?:[^()]|(?1))*\)|[\w+\-*/%&|^<>!\. ]+)\s*==\s*(\((?:[^()]|(?2))*\)|[\w+\-*/%&|^<>!\. ]+)'

关键调整说明

  • 把原来的[\w\.]扩展为[\w+\-*/%&|^<>!\. ],加入了常用的运算符和空格,覆盖表达式中的合法字符
  • 递归部分\((?:[^()]|(?1))*\)保持不变,确保能正确匹配嵌套的括号结构
  • 用|连接两种匹配分支,既支持带嵌套括号的复杂表达式,也支持简单的标识符、常量

测试验证

用你的示例测试一下这个正则,代码示例如下:

import regex

pattern = r'(\((?:[^()]|(?1))*\)|[\w+\-*/%&|^<>!\. ]+)\s*==\s*(\((?:[^()]|(?2))*\)|[\w+\-*/%&|^<>!\. ]+)'

# 测试示例1
test1 = "if (programWorkflowState.getTerminal(1, 2) == Boolean.TRUE) {"
match1 = regex.search(pattern, test1)
print(f"示例1结果:{match1.group(1).strip()} 和 {match1.group(2).strip()}")

# 测试示例2
test2 = "boolean ignore = !_isInStatic.isEmpty() && (_isInStatic.peek() == 3) && isAnonymous;"
match2 = regex.search(pattern, test2)
print(f"示例2结果:{match2.group(1).strip()} 和 {match2.group(2).strip()}")

# 测试示例3
test3 = "boolean b = (num1 * ( 2 + num2)) == value;"
match3 = regex.search(pattern, test3)
print(f"示例3结果:{match3.group(1).strip()} 和 {match3.group(2).strip()}")

运行后会输出你期望的结果:

示例1结果:programWorkflowState.getTerminal(1, 2) 和 Boolean.TRUE
示例2结果:_isInStatic.peek() 和 3
示例3结果:(num1 * ( 2 + num2)) 和 value

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:02:52