🎯 重點解釋:?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") |