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

正则表达式按竖线分割时忽略括号内竖线的实现疑问

解决括号外竖线分割的问题

你原来的正则\|\s*(?![^()]*\))只能处理单层括号,遇到嵌套括号时会失效。原因是[^()]*会匹配到第一个左括号(就停止,无法识别嵌套的括号结构,导致括号内的竖线被误分割。

以下是两种可行的解决方案:

方案1:手动遍历(通用,支持任意嵌套)

这种方法通过跟踪括号深度,只在深度为0(不在任何括号内)时分割竖线,完全不受嵌套层数限制,是最可靠的方案:

my_string = "(chargeur|magn(e|é)tique) sans fil|chargeur solaire (imperm(e|é)able|pliable)|chargeur ext(e|é)rieur externe|chargeur de t(e|é)l(e|é)phone solaire"

def split_outside_brackets(s, sep='|'):
    parts = []
    current_part = []
    bracket_depth = 0
    for c in s:
        if c == '(':
            bracket_depth += 1
        elif c == ')':
            bracket_depth = max(bracket_depth - 1, 0)  # 避免出现负深度
        elif c == sep and bracket_depth == 0:
            parts.append(''.join(current_part).strip())
            current_part = []
            continue
        current_part.append(c)
    # 添加最后一段内容
    parts.append(''.join(current_part).strip())
    return parts

my_list = split_outside_brackets(my_string)
print(my_list)

运行结果完全符合预期:

['(chargeur|magn(e|é)tique) sans fil', 'chargeur solaire (imperm(e|é)able|pliable)', 'chargeur ext(e|é)rieur externe', 'chargeur de t(e|é)l(e|é)phone solaire']

方案2:正则表达式(适用于有限嵌套)

如果你的字符串嵌套层数固定(比如最多两层),可以用调整后的正则,确保能识别嵌套括号:

import re

my_string = "(chargeur|magn(e|é)tique) sans fil|chargeur solaire (imperm(e|é)able|pliable)|chargeur ext(e|é)rieur externe|chargeur de t(e|é)l(e|é)phone solaire"

# 支持两层嵌套的正则
my_list = re.split(r'\|\s*(?=(?:[^()]|\([^()]*(?:\([^()]*\))*[^()]*\))*$)', my_string)
# 去除可能的空字符串(如果首尾有多余分隔符)
my_list = [part.strip() for part in my_list if part.strip()]
print(my_list)

正则说明:

  • \|\s*:匹配竖线和后面的任意空白字符
  • (?=(?:[^()]|\([^()]*(?:\([^()]*\))*[^()]*\))*$):正向预查确保,从当前位置到字符串结尾,所有括号都是平衡的(支持两层嵌套)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:10:49