在正则表达式中语法 (?P<名字>内容)
🎯 重点解释:?P<xxx>
是什么语法?
这一整段:
(?P<xxx>...)
是 Python 正则表达式中 “命名捕获组” 的语法。
咱们现在一个字一个字来解释:
✅ (?...)
是干啥的?
这是一个捕获组,也叫“分组”,意思是:
我要提取括号里面的内容!
比如:
(\d+)
可以从字符串里提取数字,比如从 "年龄:28岁"
中提取出 "28"
。
✅ ?P<xxx>
是什么意思?
这就是 给这个捕获组起一个名字,叫 xxx
!
拆解:
?
:告诉正则引擎,“这是一个扩展语法(非普通分组)”。P<xxx>
:表示给当前这个组取个名,名叫"xxx"
。
所以:
(?P<name>.+)
就表示:
我用括号
()
包了一段匹配规则(这里是.+
),
然后我给这段规则起了个名字叫"name"
。
✅ 为什么用 P
?为什么写成 ?P<xxx>
?
这是 Python 独有的写法,全写法是:
(?P<名字>表达式)
P
是 Python 自己规定的标记(可以理解为 Python-style)<xxx>
表示这个名字叫xxx
它的意思是:
括号里的内容是一个命名分组,名字是
xxx
。
这是 Python 正则独有的语法。JavaScript、Java、Go 用的是别的写法(比如 (?<xxx>...)
)。
✅ 举例
📄 原始文本:
[客户] Alice Wang
[电话] 13900001111
📌 正则表达式:
\[客户]\s*(?P<name>.+)\n\[电话]\s*(?P<phone>\d+)
👆 里面有两个命名捕获组:
(?P<name>.+)
:抓[客户]
后面的名字(?P<phone>\d+)
:抓[电话]
后面的数字
🧪 Python 提取代码:
import retext = "[客户] Alice Wang\n[电话] 13900001111"pattern = r"\[客户]\s*(?P<name>.+)\n\[电话]\s*(?P<phone>\d+)"match = re.search(pattern, text)if match:print("客户名:", match.group("name")) # → Alice Wangprint("手机号:", match.group("phone")) # → 13900001111
✅ 如果你不写 ?P<name>
会怎样?
那你只能用编号:
print(match.group(1)) # 拿第1个括号匹配到的内容
print(match.group(2)) # 拿第2个括号匹配到的内容
这种写法很容易搞混,不直观。
✅ 最终口诀
(?P<名字>表达式)
括号:提取内容
P<xxx>
:给内容起个名字叫xxx
→ 以后就可以用match.group("xxx")
取出结果
✅ 对照表:命名捕获组 vs 普通捕获组
写法 | 说明 | 提取方式 |
---|---|---|
(.+) | 普通分组 | match.group(1) |
(?P<name>.+) | 命名分组 | match.group("name") |