在正则表达式中语法 (?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 re

text = "[客户] 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 Wang
    print("手机号:", 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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值