如何用正则表达式拆分含AND/OR的查询语句(忽略括号内运算符)
解决方案
要实现正确拆分顶层逻辑运算符(AND/OR)而不破坏括号内的内容,核心是区分顶层运算符与括号内的嵌套运算符,可以通过两种思路实现:
思路1:直接匹配完整条件项
通过正则识别每个独立条件的完整结构,避免拆分操作带来的误判。这种方式兼容性更强,还能支持多层括号嵌套的场景。
正则表达式(PCRE兼容)
\b\w+-?\w+=(?:\((?:[^()]|(?R))+\)|[^ANDOR\s]+)(?=\s+(?:AND|OR)\s+|$)
正则规则解释
\b\w+-?\w+:匹配条件键名(如procedure-type、notice-type),支持带连字符的命名格式=:匹配赋值符号(?:\((?:[^()]|(?R))+\)|[^ANDOR\s]+):分支处理两种赋值场景:\((?:[^()]|(?R))+\):匹配括号包裹的内容,(?R)递归匹配整个正则,支持多层括号嵌套[^ANDOR\s]+:匹配无括号的单个值(如procedure-type=C中的C)
(?=\s+(?:AND|OR)\s+|$):正向预查,确保当前匹配内容的后续是顶层AND/OR或字符串结尾,避免截断有效内容
验证示例
针对目标查询语句:
procedure-type=(C OR B) AND notice-type=(cn-standard OR can-standard) OR nature=(3 OR 9|Z OR services)
使用该正则匹配后,将得到三个独立条件项:
procedure-type=(C OR B) notice-type=(cn-standard OR can-standard) nature=(3 OR 9|Z OR services)
同时兼容无括号场景,比如输入procedure-type=C AND notice-type=cn-standard,会拆分出:
procedure-type=C notice-type=cn-standard
Python代码实现
需要使用支持递归正则的regex库(标准库re不支持递归语法):
import regex query = "procedure-type=(C OR B) AND notice-type=(cn-standard OR can-standard) OR nature=(3 OR 9|Z OR services)" pattern = r'\b\w+-?\w+=(?:\((?:[^()]|(?R))+\)|[^ANDOR\s]+)(?=\s+(?:AND|OR)\s+|$)' matches = regex.findall(pattern, query) for item in matches: print(item)
思路2:拆分顶层逻辑运算符
如果倾向于通过拆分方式实现,可以用正则定位不在括号内的AND/OR作为分隔符:
拆分用正则表达式
\s+(?:AND|OR)\s+(?=(?:[^()]|\([^()]*\))*$)
规则解释
\s+(?:AND|OR)\s+:匹配带前后空格的顶层逻辑运算符(?=(?:[^()]|\([^()]*\))*$):正向预查,确保后续内容中的括号是成对闭合的,以此确认当前运算符处于顶层
拆分示例(Python)
import re query = "procedure-type=(C OR B) AND notice-type=(cn-standard OR can-standard) OR nature=(3 OR 9|Z OR services)" split_pattern = r'\s+(?:AND|OR)\s+(?=(?:[^()]|\([^()]*\))*$)' items = re.split(split_pattern, query) for item in items: print(item)
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

