一文詳解正則表達(dá)式中的元字符(python)
前言
正則表達(dá)式中的元字符是具有特殊含義的字符,它們不代表字符本身,而是用于描述字符的模式(如匹配一類字符、重復(fù)次數(shù)、位置等)。掌握元字符是學(xué)好正則的核心。
一、元字符的分類與核心規(guī)則
元字符可分為字符匹配類、數(shù)量限定類、位置錨定類、邏輯分組類四大類,每類都有明確的語(yǔ)法規(guī)則:
1. 字符匹配類:匹配特定類型的字符
這類元字符用于表示 “某一類字符”,而非具體字符,是正則靈活性的基礎(chǔ)。
| 元字符 | 含義(規(guī)則) | 示例 |
|---|---|---|
. | 匹配任意單個(gè)字符(除換行符 \n,部分模式下可匹配換行) | a.b 匹配 acb、a-b、a1b(中間是任意字符) |
\d | 匹配任意數(shù)字(0-9),等價(jià)于 [0-9] | \d{3} 匹配 123、456(3 位數(shù)字) |
\D | 匹配非數(shù)字字符,等價(jià)于 [^0-9] | \D 匹配 a、!、_(非數(shù)字) |
\w | 匹配字母、數(shù)字、下劃線(a-z、A-Z、0-9、_),等價(jià)于 [a-zA-Z0-9_] | \w+ 匹配 user123、name_456(連續(xù)的單詞字符) |
\W | 匹配非單詞字符(除字母、數(shù)字、下劃線外的字符,如空格、標(biāo)點(diǎn)) | \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,因?yàn)?b 至少 1 次) |
? | 匹配前面的元素 0 次或 1 次(可選) | ab? 匹配 a(b 出現(xiàn) 0 次)、ab(b 出現(xiàn) 1 次)(不匹配 abb) |
{n} | 匹配前面的元素 恰好 n 次 | a{3} 匹配 aaa(正好 3 個(gè) a) |
{n,} | 匹配前面的元素 至少 n 次 | a{2,} 匹配 aa、aaa(2 個(gè)及以上 a) |
{n,m} | 匹配前面的元素 至少 n 次,至多 m 次(n ≤ m) | a{1,3} 匹配 a、aa、aaa(1-3 個(gè) a) |
*? +? ?? {n,m}? | 非貪婪模式(盡可能少匹配,加在數(shù)量詞后) | a.*?b 匹配 aab 中的 aab(而非貪婪模式的更長(zhǎng)匹配) |
3. 位置錨定類:匹配字符串中的特定位置(不匹配具體字符)
這類元字符不匹配實(shí)際字符,只匹配 “位置”(如開頭、結(jié)尾、單詞邊界),用于限定匹配的上下文。
| 元字符 | 含義(規(guī)則) | 示例 |
|---|---|---|
^ | 匹配字符串的開頭位置(在多行模式下匹配每行開頭) | ^hello 匹配 hello world(以 hello 開頭),不匹配 ahello |
$ | 匹配字符串的結(jié)尾位置(在多行模式下匹配每行結(jié)尾) | world$ 匹配 hello world(以 world 結(jié)尾),不匹配 worlda |
\b | 匹配單詞邊界(單詞字符與非單詞字符的交界處,或字符串開頭 / 結(jié)尾與單詞字符的交界) | \bcat\b 匹配 cat、a cat(獨(dú)立的 cat),不匹配 category(cat 是前綴) |
\B | 匹配非單詞邊界(單詞字符之間的位置) | \Bcat\B 匹配 category 中的 cat(cat 在單詞中間) |
4. 邏輯分組類:實(shí)現(xiàn)分組、選擇、引用等復(fù)雜邏輯
這類元字符用于組合多個(gè)元素為一個(gè)整體,或?qū)崿F(xiàn)邏輯選擇、復(fù)用匹配結(jié)果等。
| 元字符 | 含義(規(guī)則) | 示例 |
|---|---|---|
(...) | 分組:將括號(hào)內(nèi)的內(nèi)容視為一個(gè)整體(可被數(shù)量詞修飾或引用) | (ab)+ 匹配 ab、abab(ab 整體重復(fù) 1 次或多次) |
| | 選擇:匹配 | 兩邊的任意一個(gè)表達(dá)式(類似 “或” 邏輯) | a|b 匹配 a 或 b;(ab)|(cd) 匹配 ab 或 cd |
\1 \2 ... | 反向引用:引用第 n 個(gè)分組匹配的內(nèi)容(\1 對(duì)應(yīng)第一個(gè)分組,\2 對(duì)應(yīng)第二個(gè),以此類推) | (\w+) \1 匹配 hello hello(重復(fù)的單詞)、123 123(重復(fù)的數(shù)字) |
(?:...) | 非捕獲分組:僅分組,不捕獲內(nèi)容(無(wú)法通過(guò)反向引用調(diào)用,節(jié)省內(nèi)存) | (?:ab)+ 功能同 (ab)+,但不能用 \1 引用 |
二、透徹理解元字符的核心原則
“元字符” 與 “普通字符” 的轉(zhuǎn)換
元字符默認(rèn)具有特殊含義,若要匹配其本身(如.、*、(等),需用轉(zhuǎn)義符\處理。
例:匹配字符串中的.需寫成\.(如a\.b匹配a.b,而非acb)。貪婪模式與非貪婪模式的區(qū)別
數(shù)量詞默認(rèn)是貪婪模式(盡可能匹配最長(zhǎng)結(jié)果),加?后變?yōu)?strong>非貪婪模式(盡可能匹配最短結(jié)果)。
例:對(duì)aaab用a.*b(貪婪)會(huì)匹配整個(gè)aaab;用a.*?b(非貪婪)也匹配aaab(因只有一種可能),但對(duì)aabab則前者匹配aabab,后者匹配aab。位置錨定的 “零寬度” 特性
位置錨定(如^、$、\b)不占用字符位置,僅用于限定匹配的位置。
例:^a匹配的是 “字符串開頭” 這個(gè)位置后面跟著a,而不是匹配一個(gè)字符。分組的 “整體性” 與 “捕獲性”
(...)會(huì)將分組內(nèi)的匹配結(jié)果 “捕獲” 并暫存,可通過(guò)反向引用(\1)或匹配對(duì)象的group(n)調(diào)用。
例:(\d{3})-(\d{4})匹配123-4567時(shí),\1引用123,\2引用4567。
三、實(shí)踐:如何靈活運(yùn)用元字符?
掌握元字符的關(guān)鍵是 “拆解需求→組合元字符→驗(yàn)證調(diào)整”,以下是幾個(gè)典型場(chǎng)景:
場(chǎng)景 1:驗(yàn)證手機(jī)號(hào)(11 位數(shù)字,以 1 開頭)
需求拆解:
- 開頭必須是
1(用^1錨定) - 后面跟 10 位數(shù)字(
\d{10}) - 整體長(zhǎng)度固定 11 位(用
$錨定結(jié)尾,避免多余字符)
正則:
^1\d{10}$
測(cè)試:匹配 13800138000,不匹配 123456(長(zhǎng)度不足)、23800138000(不以 1 開頭)。
場(chǎng)景 2:提取 URL 中的域名(如從https://www.baidu.com/path提取baidu.com)
需求拆解:
- URL 格式通常為
協(xié)議://[www.]域名/路徑 - 域名在
//之后、/之前,可能包含.和字母
正則:
//(?:www\.)?([a-zA-Z0-9]+\.[a-zA-Z]+)/
解析:
//匹配//固定字符(需轉(zhuǎn)義嗎?/在 Python 中無(wú)需轉(zhuǎn)義,視語(yǔ)言而定)(?:www\.)?:非捕獲分組,匹配可選的www.(?表示 0 或 1 次)([a-zA-Z0-9]+\.[a-zA-Z]+):捕獲域名(如baidu.com,字母數(shù)字 +.+ 字母)/匹配域名后的/
測(cè)試:從 https://www.baidu.com/path 中提取到 baidu.com。
場(chǎng)景 3:替換重復(fù)的單詞(如將hello hello改為hello)
需求拆解:
- 匹配重復(fù)的單詞(相同單詞連續(xù)出現(xiàn))
- 單詞由
\w+組成,用分組(\w+)捕獲 - 重復(fù)部分為
\1(引用第一個(gè)分組),中間可能有空格
正則:
(\w+) \1
替換:用 \1 替換(保留一個(gè)即可)
測(cè)試:hello hello world world → 替換后為 hello world。
四、工具推薦:快速驗(yàn)證正則
學(xué)習(xí)過(guò)程中,建議用工具實(shí)時(shí)測(cè)試正則效果,推薦:
- 在線工具:RegExr(可視化匹配過(guò)程,適合新手)、Regex101(支持多語(yǔ)言,顯示分組和引用)
- Python 內(nèi)置:用
re模塊的match()、search()、findall()配合print()調(diào)試。
五、總結(jié)
元字符是正則的 “積木”,核心在于理解每類元字符的規(guī)則邊界(如 \d 只匹配數(shù)字,+ 至少 1 次),并通過(guò) “拆解需求→組合元字符→驗(yàn)證調(diào)整” 的流程練習(xí)。初期可從簡(jiǎn)單場(chǎng)景(如提取數(shù)字、驗(yàn)證格式)入手,逐步嘗試復(fù)雜邏輯(如分組引用、非貪婪匹配),熟練后就能應(yīng)對(duì)大部分字符串處理需求。
到此這篇關(guān)于正則表達(dá)式中元字符(python)的文章就介紹到這了,更多相關(guān)python正則表達(dá)式元字符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)戰(zhàn)scrapy操作cookie爬取博客涉及browsercookie
這篇文章主要為大家介紹了python實(shí)戰(zhàn)scrapy操作cookie爬取博客涉及browsercookie,下面來(lái)學(xué)習(xí)一下 scrapy 操作 Cookie來(lái)爬取博客吧2021-11-11
python操作xlsx文件的包openpyxl實(shí)例
下面小編就為大家分享一篇python操作xlsx文件的包openpyxl實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
使用ITK-SNAP進(jìn)行摳圖操作并保存mask的實(shí)例
這篇文章主要介紹了使用ITK-SNAP進(jìn)行摳圖操作并保存mask的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
Django JSonResponse對(duì)象的實(shí)現(xiàn)
本文主要介紹了Django JSonResponse對(duì)象的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
django-celery-beat搭建定時(shí)任務(wù)的實(shí)現(xiàn)
本文主要介紹了django-celery-beat搭建定時(shí)任務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Python利用wxPython實(shí)現(xiàn)長(zhǎng)文本處理
這篇文章主要為大家詳細(xì)介紹了Python如何利用wxPython實(shí)現(xiàn)長(zhǎng)文本處理功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05
Python基于正則表達(dá)式實(shí)現(xiàn)檢查文件內(nèi)容的方法【文件檢索】
這篇文章主要介紹了Python基于正則表達(dá)式實(shí)現(xiàn)檢查文件內(nèi)容的方法,可實(shí)現(xiàn)針對(duì)文件中import強(qiáng)制依賴的文件關(guān)系檢索,涉及Python文件目錄的遍歷及正則匹配相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
這篇文章主要介紹了PyQt5.6+pycharm配置以及pyinstaller生成exe,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
python安裝oracle擴(kuò)展及數(shù)據(jù)庫(kù)連接方法
這篇文章主要介紹了python安裝oracle擴(kuò)展及數(shù)據(jù)庫(kù)連接方法,較為詳細(xì)的分析了Python下載oracle擴(kuò)展及Windows、Linux環(huán)境下的安裝步驟、操作技巧及注意事項(xiàng),需要的朋友可以參考下2017-02-02
django將網(wǎng)絡(luò)中的圖片,保存成model中的ImageField的實(shí)例
今天小編就為大家分享一篇django將網(wǎng)絡(luò)中的圖片,保存成model中的ImageField的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

