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

如何用正则表达式拆分含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:12:27