如何在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
相关产品推荐
相关产品推荐

