一文詳解正則表達式中的元字符(python)
前言
正則表達式中的元字符是具有特殊含義的字符,它們不代表字符本身,而是用于描述字符的模式(如匹配一類字符、重復(fù)次數(shù)、位置等)。掌握元字符是學(xué)好正則的核心。
一、元字符的分類與核心規(guī)則
元字符可分為字符匹配類、數(shù)量限定類、位置錨定類、邏輯分組類四大類,每類都有明確的語法規(guī)則:
1. 字符匹配類:匹配特定類型的字符
這類元字符用于表示 “某一類字符”,而非具體字符,是正則靈活性的基礎(chǔ)。
| 元字符 | 含義(規(guī)則) | 示例 |
|---|---|---|
. | 匹配任意單個字符(除換行符 \n,部分模式下可匹配換行) | a.b 匹配 acb、a-b、a1b(中間是任意字符) |
\d | 匹配任意數(shù)字(0-9),等價于 [0-9] | \d{3} 匹配 123、456(3 位數(shù)字) |
\D | 匹配非數(shù)字字符,等價于 [^0-9] | \D 匹配 a、!、_(非數(shù)字) |
\w | 匹配字母、數(shù)字、下劃線(a-z、A-Z、0-9、_),等價于 [a-zA-Z0-9_] | \w+ 匹配 user123、name_456(連續(xù)的單詞字符) |
\W | 匹配非單詞字符(除字母、數(shù)字、下劃線外的字符,如空格、標(biāo)點) | \W 匹配 @、#、(空格) |
\s | 匹配空白字符(空格、制表符 \t、換行符 \n 等) | a\sb 匹配 a b(a 和 b 之間有空格)、a\tb(a 和 b 之間有制表符) |
\S | 匹配非空白字符 | \S+ 匹配 hello、123!(不含空白的連續(xù)字符) |
2. 數(shù)量限定類:控制字符 / 分組的重復(fù)次數(shù)
這類元字符用于限定 “前面的字符或分組” 出現(xiàn)的次數(shù),必須跟在被限定的元素后面。
| 元字符 | 含義(規(guī)則) | 示例 |
|---|---|---|
* | 匹配前面的元素 0 次或多次(盡可能多匹配,貪婪模式) | ab* 匹配 a(b 出現(xiàn) 0 次)、ab(b 出現(xiàn) 1 次)、abbb(b 出現(xiàn) 3 次) |
+ | 匹配前面的元素 1 次或多次(至少 1 次) | ab+ 匹配 ab、abb(不匹配 a,因為 b 至少 1 次) |
? | 匹配前面的元素 0 次或 1 次(可選) | ab? 匹配 a(b 出現(xiàn) 0 次)、ab(b 出現(xiàn) 1 次)(不匹配 abb) |
{n} | 匹配前面的元素 恰好 n 次 | a{3} 匹配 aaa(正好 3 個 a) |
{n,} | 匹配前面的元素 至少 n 次 | a{2,} 匹配 aa、aaa(2 個及以上 a) |
{n,m} | 匹配前面的元素 至少 n 次,至多 m 次(n ≤ m) | a{1,3} 匹配 a、aa、aaa(1-3 個 a) |
*? +? ?? {n,m}? | 非貪婪模式(盡可能少匹配,加在數(shù)量詞后) | a.*?b 匹配 aab 中的 aab(而非貪婪模式的更長匹配) |
3. 位置錨定類:匹配字符串中的特定位置(不匹配具體字符)
這類元字符不匹配實際字符,只匹配 “位置”(如開頭、結(jié)尾、單詞邊界),用于限定匹配的上下文。
| 元字符 | 含義(規(guī)則) | 示例 |
|---|---|---|
^ | 匹配字符串的開頭位置(在多行模式下匹配每行開頭) | ^hello 匹配 hello world(以 hello 開頭),不匹配 ahello |
$ | 匹配字符串的結(jié)尾位置(在多行模式下匹配每行結(jié)尾) | world$ 匹配 hello world(以 world 結(jié)尾),不匹配 worlda |
\b | 匹配單詞邊界(單詞字符與非單詞字符的交界處,或字符串開頭 / 結(jié)尾與單詞字符的交界) | \bcat\b 匹配 cat、a cat(獨立的 cat),不匹配 category(cat 是前綴) |
\B | 匹配非單詞邊界(單詞字符之間的位置) | \Bcat\B 匹配 category 中的 cat(cat 在單詞中間) |
4. 邏輯分組類:實現(xiàn)分組、選擇、引用等復(fù)雜邏輯
這類元字符用于組合多個元素為一個整體,或?qū)崿F(xiàn)邏輯選擇、復(fù)用匹配結(jié)果等。
| 元字符 | 含義(規(guī)則) | 示例 |
|---|---|---|
(...) | 分組:將括號內(nèi)的內(nèi)容視為一個整體(可被數(shù)量詞修飾或引用) | (ab)+ 匹配 ab、abab(ab 整體重復(fù) 1 次或多次) |
| | 選擇:匹配 | 兩邊的任意一個表達式(類似 “或” 邏輯) | a|b 匹配 a 或 b;(ab)|(cd) 匹配 ab 或 cd |
\1 \2 ... | 反向引用:引用第 n 個分組匹配的內(nèi)容(\1 對應(yīng)第一個分組,\2 對應(yīng)第二個,以此類推) | (\w+) \1 匹配 hello hello(重復(fù)的單詞)、123 123(重復(fù)的數(shù)字) |
(?:...) | 非捕獲分組:僅分組,不捕獲內(nèi)容(無法通過反向引用調(diào)用,節(jié)省內(nèi)存) | (?:ab)+ 功能同 (ab)+,但不能用 \1 引用 |
二、透徹理解元字符的核心原則
“元字符” 與 “普通字符” 的轉(zhuǎn)換
元字符默認具有特殊含義,若要匹配其本身(如.、*、(等),需用轉(zhuǎn)義符\處理。
例:匹配字符串中的.需寫成\.(如a\.b匹配a.b,而非acb)。貪婪模式與非貪婪模式的區(qū)別
數(shù)量詞默認是貪婪模式(盡可能匹配最長結(jié)果),加?后變?yōu)?strong>非貪婪模式(盡可能匹配最短結(jié)果)。
例:對aaab用a.*b(貪婪)會匹配整個aaab;用a.*?b(非貪婪)也匹配aaab(因只有一種可能),但對aabab則前者匹配aabab,后者匹配aab。位置錨定的 “零寬度” 特性
位置錨定(如^、$、\b)不占用字符位置,僅用于限定匹配的位置。
例:^a匹配的是 “字符串開頭” 這個位置后面跟著a,而不是匹配一個字符。分組的 “整體性” 與 “捕獲性”
(...)會將分組內(nèi)的匹配結(jié)果 “捕獲” 并暫存,可通過反向引用(\1)或匹配對象的group(n)調(diào)用。
例:(\d{3})-(\d{4})匹配123-4567時,\1引用123,\2引用4567。
三、實踐:如何靈活運用元字符?
掌握元字符的關(guān)鍵是 “拆解需求→組合元字符→驗證調(diào)整”,以下是幾個典型場景:
場景 1:驗證手機號(11 位數(shù)字,以 1 開頭)
需求拆解:
- 開頭必須是
1(用^1錨定) - 后面跟 10 位數(shù)字(
\d{10}) - 整體長度固定 11 位(用
$錨定結(jié)尾,避免多余字符)
正則:
^1\d{10}$
測試:匹配 13800138000,不匹配 123456(長度不足)、23800138000(不以 1 開頭)。
場景 2:提取 URL 中的域名(如從https://www.baidu.com/path提取baidu.com)
需求拆解:
- URL 格式通常為
協(xié)議://[www.]域名/路徑 - 域名在
//之后、/之前,可能包含.和字母
正則:
//(?:www\.)?([a-zA-Z0-9]+\.[a-zA-Z]+)/
解析:
//匹配//固定字符(需轉(zhuǎn)義嗎?/在 Python 中無需轉(zhuǎn)義,視語言而定)(?:www\.)?:非捕獲分組,匹配可選的www.(?表示 0 或 1 次)([a-zA-Z0-9]+\.[a-zA-Z]+):捕獲域名(如baidu.com,字母數(shù)字 +.+ 字母)/匹配域名后的/
測試:從 https://www.baidu.com/path 中提取到 baidu.com。
場景 3:替換重復(fù)的單詞(如將hello hello改為hello)
需求拆解:
- 匹配重復(fù)的單詞(相同單詞連續(xù)出現(xiàn))
- 單詞由
\w+組成,用分組(\w+)捕獲 - 重復(fù)部分為
\1(引用第一個分組),中間可能有空格
正則:
(\w+) \1
替換:用 \1 替換(保留一個即可)
測試:hello hello world world → 替換后為 hello world。
四、工具推薦:快速驗證正則
學(xué)習(xí)過程中,建議用工具實時測試正則效果,推薦:
- 在線工具:RegExr(可視化匹配過程,適合新手)、Regex101(支持多語言,顯示分組和引用)
- Python 內(nèi)置:用
re模塊的match()、search()、findall()配合print()調(diào)試。
五、總結(jié)
元字符是正則的 “積木”,核心在于理解每類元字符的規(guī)則邊界(如 \d 只匹配數(shù)字,+ 至少 1 次),并通過 “拆解需求→組合元字符→驗證調(diào)整” 的流程練習(xí)。初期可從簡單場景(如提取數(shù)字、驗證格式)入手,逐步嘗試復(fù)雜邏輯(如分組引用、非貪婪匹配),熟練后就能應(yīng)對大部分字符串處理需求。
到此這篇關(guān)于正則表達式中元字符(python)的文章就介紹到這了,更多相關(guān)python正則表達式元字符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python學(xué)習(xí)筆記之字符串和字符串方法實例詳解
這篇文章主要介紹了Python學(xué)習(xí)筆記之字符串和字符串方法,結(jié)合實例形式詳細分析了Python字符串相關(guān)操作函數(shù)與使用技巧,需要的朋友可以參考下2019-08-08
matplotlib之pyplot模塊坐標(biāo)軸標(biāo)簽設(shè)置使用(xlabel()、ylabel())
這篇文章主要介紹了matplotlib之pyplot模塊坐標(biāo)軸標(biāo)簽設(shè)置使用(xlabel()、ylabel()),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
Python數(shù)據(jù)可視化之聚類圖實現(xiàn)代碼
聚類分析是數(shù)據(jù)挖掘和機器學(xué)習(xí)中常用的無監(jiān)督學(xué)習(xí)方法,用于將數(shù)據(jù)分組為具有相似特征的簇,這篇文章主要介紹了Python數(shù)據(jù)可視化之聚類圖實現(xiàn)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-12-12
python web框架Flask實現(xiàn)圖形驗證碼及驗證碼的動態(tài)刷新實例
在本篇文章里小編給大家整理的是關(guān)于python web框架Flask實現(xiàn)圖形驗證碼的相關(guān)知識點,有需要的朋友們參考下。2019-10-10
Python 對象序列化與反序列化之pickle json詳細解析
我們知道在Python中,一切皆為對象,實例是對象,類是對象,元類也是對象。本文正是要聊聊如何將這些對象有效地保存起來,以供后續(xù)使用2021-09-09
Transpose 數(shù)組行列轉(zhuǎn)置的限制方式
今天小編就為大家分享一篇Transpose 數(shù)組行列轉(zhuǎn)置的限制方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02

