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

Python正则表达式提取不同分隔符间的分组问题

从嵌套括号文本中提取目标分组的正则解决方案

问题背景

需要从文本 text = '[[aaa / bbb (T1=T2)] / [bbb (T1=T2) / bbb (T1>T2)]]' 中提取出目标列表:['aaa', 'bbb (T1=T2)', 'bbb (T1=T2)', 'bbb (T1>T2)'],指定的分隔符为:

  • 一个或多个左括号:\[*
  • 一个或多个右括号:\]*
  • 空格包裹的斜杠:\s\/\s

之前尝试的正则 re.findall(r'[\[*|\]*|\s\/\s](.*?)[\[*|\]*|\s\/\s]', text) 匹配失败,原因是字符集[]会把\s\/\s拆成单个字符(空格、/、空格),无法作为整体分隔符匹配。


正确实现方案

方案1:使用非捕获组匹配分隔符,提取有效内容

通过**非捕获组(?:...)**将多个分隔符选项组合,同时用正向预查确保捕获的内容被分隔符或文本结尾包裹:

import re

text = '[[aaa / bbb (T1=T2)] / [bbb (T1=T2) / bbb (T1>T2)]]'
# 正则模式:匹配左括号组、右括号组、空格/空格,捕获中间内容,直到下一个分隔符或结尾
pattern = r'(?:\[+|\]+|\s\/\s)(.*?)(?=\[+|\]+|\s\/\s|$)'
raw_result = re.findall(pattern, text)
# 过滤空字符串并去除首尾空白
final_result = [item.strip() for item in raw_result if item.strip()]

print(final_result)
# 输出:['aaa', 'bbb (T1=T2)', 'bbb (T1=T2)', 'bbb (T1>T2)']

方案2:按分隔符分割后过滤无效项

用re.split直接按指定分隔符分割文本,再过滤掉空串和纯空白项:

import re

text = '[[aaa / bbb (T1=T2)] / [bbb (T1=T2) / bbb (T1>T2)]]'
# 分割符规则:一个或多个左括号、一个或多个右括号、空格/空格
split_pattern = r'\[+|\]+|\s\/\s'
parts = re.split(split_pattern, text)
# 过滤处理
final_result = [part.strip() for part in parts if part.strip()]

print(final_result)
# 输出:['aaa', 'bbb (T1=T2)', 'bbb (T1=T2)', 'bbb (T1>T2)']

错误原因解析

你之前使用的[\[*|\]*|\s\/\s]是字符集表达式,它的特性是:

  • 字符集内的所有字符都会被当作独立的匹配候选,而非整体序列
  • 比如\s\/\s会被拆成 、/、 三个单独字符,\[*会被拆成[和*两个字符
  • 这导致正则会匹配任意单个括号、星号、空格或斜杠,完全偏离了把\s\/\s作为整体分隔符的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:35:01