括号()在正则中是捕获组核心机制,可提取子串并按序编号;支持非捕获组(?:...)、命名组(?P<name>...);能处理嵌套与多括号结构,需注意字面括号须转义。

括号 () 在正则表达式中不只是分组工具,更是提取关键片段的核心机制。它通过“捕获组”把匹配到的子串单独拎出来,尤其适合处理嵌套、多层结构或带条件的复杂字符串。
括号作为捕获组的基本用法
写在 () 里的内容一旦匹配成功,就会被保存为一个独立的“捕获组”,可通过索引(如 .group(1))、名称(如 .group("name"))或列表(如 .groups())直接取用。
-
默认按左括号顺序编号:从左到右,第一个
(...)是 group 1,第二个是 group 2,依此类推 -
非捕获组用
(?:...):只分组不捕获,避免干扰编号,也提升效率 -
命名捕获组写成
(?P<name>...):让结果更可读,比如match.group("year")
提取带嵌套或重复结构的内容
普通括号无法自动处理嵌套(如 (a(b)c)),但结合正则的递归语法或多次匹配,可应对常见层级。例如提取形如 "key:value (inner:val)" 中的键值对:
import re
text = "name:alice (age:30, city:beijing)"
# 匹配 'key:value' 模式,value 可含括号内容
pattern = r"(\w+):\s*([^(),]+(?:\([^()]*\))?[^()]*)"
matches = re.findall(pattern, text)
# 得到 [('name', 'alice'), ('age', '30'), ('city', 'beijing')]
这里外层括号捕获 key,内层括号配合非贪婪和可选结构,实现对简单嵌套 value 的识别。
处理多个括号并存时的提取逻辑
当字符串中有多个括号段,比如 "[id:123] [type:user] [status:active]",用 findall 配合捕获组最直接:
-
re.findall(r"\[(\w+):(\w+)\]", text)→ 返回[('id', '123'), ('type', 'user'), ('status', 'active')] - 每个
()对应一个字段,结果是元组列表,结构清晰,无需手动切分 - 若只需某一项,可用
re.search+.group(1)精准定位
注意括号的转义与实际含义
如果目标字符串本身含字面意义的括号(如 "CPU usage: (75%)"),必须用 \( 和 \) 转义,否则会被当作正则语法解析:
- 错:
r"(.*?)%"→ 会尝试匹配任意内容直到%,但开头的(被当成捕获组起始 - 对:
r"\((.*?)%\)"→ 正确匹配字面括号,并捕获中间数字 - 也可用
re.escape("(75%")自动转义不确定的字符串片段

















