在正则表达式中语法 (?P<名字>内容)

重点解释:?P 是什么语法?

这一整段:

(?P...)

是 Python 正则表达式中 “命名捕获组” 的语法。
咱们现在一个字一个字来解释:


(?...) 是干啥的?

这是一个捕获组,也叫“分组”,意思是:

我要提取括号里面的内容!

比如:

(\d+)

可以从字符串里提取数字,比如从 "年龄:28岁" 中提取出 "28"


?P 是什么意思?

这就是 给这个捕获组起一个名字,叫 xxx

拆解:

  • ?:告诉正则引擎,“这是一个扩展语法(非普通分组)”。
  • P:表示给当前这个组取个名,名叫 "xxx"

所以:

(?P.+)

就表示:

我用括号 () 包了一段匹配规则(这里是 .+),
然后我给这段规则起了个名字"name"


✅ 为什么用 P?为什么写成 ?P

这是 Python 独有的写法,全写法是:

(?P<名字>表达式)
  • P 是 Python 自己规定的标记(可以理解为 Python-style)
  • 表示这个名字叫 xxx

它的意思是:

括号里的内容是一个命名分组,名字是 xxx

这是 Python 正则独有的语法。JavaScript、Java、Go 用的是别的写法(比如 (?...))。


✅ 举例

原始文本:

[客户] Alice Wang
[电话] 13900001111

正则表达式:

\[客户]\s*(?P.+)\n\[电话]\s*(?P\d+)

里面有两个命名捕获组:

  • (?P.+):抓 [客户] 后面的名字
  • (?P\d+):抓 [电话] 后面的数字

Python 提取代码:

import re

text = "[客户] Alice Wang\n[电话] 13900001111"

pattern = r"\[客户]\s*(?P.+)\n\[电话]\s*(?P\d+)"

match = re.search(pattern, text)

if match:
    print("客户名:", match.group("name"))   # → Alice Wang
    print("手机号:", match.group("phone"))  # → 13900001111

✅ 如果你不写 ?P 会怎样?

那你只能用编号:

print(match.group(1))  # 拿第1个括号匹配到的内容
print(match.group(2))  # 拿第2个括号匹配到的内容

这种写法很容易搞混,不直观。


✅ 最终口诀

(?P<名字>表达式)

括号:提取内容
P:给内容起个名字叫 xxx
→ 以后就可以用 match.group("xxx") 取出结果


✅ 对照表:命名捕获组 vs 普通捕获组

写法 说明 提取方式
(.+) 普通分组 match.group(1)
(?P.+) 命名分组 match.group("name")

你可能感兴趣的:(python,正则表达式,python)