python正則表達(dá)式標(biāo)準(zhǔn)庫之re庫的詳細(xì)介紹
1. 模塊概述
re 是 Python 標(biāo)準(zhǔn)庫中用于正則表達(dá)式操作的模塊,提供字符串的復(fù)雜模式匹配、搜索、替換等功能。正則表達(dá)式(Regex)通過特定語法規(guī)則描述字符串模式,適用于文本解析、數(shù)據(jù)清洗、輸入驗(yàn)證等場景。
2. 核心概念
?**(1) 正則表達(dá)式語法**
- ?普通字符:如
a、1直接匹配自身。 - ?特殊字符:
.:匹配任意字符(除換行符,除非啟用re.DOTALL)。^:匹配字符串開頭。$:匹配字符串結(jié)尾。\d:匹配數(shù)字(等價(jià)于[0-9])。\w:匹配字母、數(shù)字、下劃線(等價(jià)于[a-zA-Z0-9_])。\s:匹配空白符(空格、制表符、換行等)。[]:字符集合(如[a-z]匹配小寫字母)。|:邏輯或(如a|b匹配a或b)。
- ?量詞:
*:匹配前一個(gè)字符 0 次或多次。+:匹配前一個(gè)字符 1 次或多次。?:匹配前一個(gè)字符 0 次或 1 次。{m}:匹配前一個(gè)字符恰好m次。{m,n}:匹配前一個(gè)字符m到n次。
- ?分組與捕獲:
():定義捕獲組(可通過索引或命名引用)。(?:):非捕獲組(僅分組,不捕獲)。
?**(2) 修飾符(Flags)?**
| 修飾符 | 描述 |
|---|---|
re.IGNORECASE (或 re.I) | 忽略大小寫 |
re.MULTILINE (或 re.M) | 多行模式(^ 和 $ 匹配每行的開頭/結(jié)尾) |
re.DOTALL (或 re.S) | . 匹配包括換行符在內(nèi)的所有字符 |
re.VERBOSE (或 re.X) | 允許正則表達(dá)式換行并添加注釋 |
?3. 常用函數(shù)與示例
?**(1) 匹配與搜索**
| 函數(shù) | 描述 | 示例 |
|---|---|---|
re.match(pattern, string) | ?從字符串開頭匹配模式,成功返回 Match 對(duì)象,否則返回 None。 | re.match(r'\d+', '123abc') → Match 對(duì)象(匹配 '123') |
re.search(pattern, string) | ?掃描整個(gè)字符串查找第一個(gè)匹配,成功返回 Match 對(duì)象,否則返回 None。 | re.search(r'\d+', 'abc123def') → Match 對(duì)象(匹配 '123') |
re.findall(pattern, string) | 返回所有非重疊匹配的列表(直接返回字符串或元組列表)。 | re.findall(r'\d+', 'a1b22c333') → ['1', '22', '333'] |
re.finditer(pattern, string) | 返回所有匹配的迭代器,每個(gè)元素是 Match 對(duì)象。 | [m.group() for m in re.finditer(r'\d+', 'a1b22')] → ['1', '22'] |
示例代碼:
import re
text = "Email: user@example.com, Phone: 123-456-7890"
# 提取郵箱
email = re.search(r'\w+@\w+\.\w+', text).group() # 'user@example.com'
# 提取所有電話號(hào)碼片段
phones = re.findall(r'\d{3}-\d{3}-\d{4}', text) # ['123-456-7890']**(2) 替換與分割**
| 函數(shù) | 描述 | 示例 |
|---|---|---|
re.sub(pattern, repl, string) | 將匹配模式的部分替換為 repl,返回新字符串。 | re.sub(r'\d+', '#', 'a1b22c') → 'a#b#c' |
re.split(pattern, string) | 按模式分割字符串,返回列表。 | re.split(r'\W+', 'Hello, world!') → ['Hello', 'world', ''] |
示例代碼:
# 替換日期格式(YYYY-MM-DD → DD/MM/YYYY)
date = "2023-10-05"
new_date = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3/\2/\1', date) # '05/10/2023'
# 分割復(fù)雜文本
text = "apple,,banana;;cherry"
parts = re.split(r'[,;]+', text) # ['apple', 'banana', 'cherry']**(3) 預(yù)編譯正則表達(dá)式**
使用 re.compile() 預(yù)編譯正則表達(dá)式以提高效率(尤其需多次使用同一模式時(shí)):
pattern = re.compile(r'\d+')
match = pattern.match('123abc') # 等效于 re.match(r'\d+', '123abc')**(4) 匹配對(duì)象(Match Object)?**
成功匹配后返回的 Match 對(duì)象提供以下方法:
| 方法 | 描述 |
|---|---|
group(n) | 返回第 n 個(gè)分組(默認(rèn) n=0 表示整個(gè)匹配)。 |
groups() | 返回所有分組的元組。 |
start() / end() | 返回匹配的起始/結(jié)束索引。 |
span() | 返回匹配的索引范圍元組 (start, end)。 |
示例:
text = "Date: 2023-10-05"
match = re.search(r'(\d{4})-(\d{2})-(\d{2})', text)
if match:
print(match.group(0)) # '2023-10-05'
print(match.group(1)) # '2023'
print(match.groups()) # ('2023', '10', '05')
print(match.span(1)) # (6, 10)4. 高級(jí)技巧
?**(1) 非貪婪匹配**
默認(rèn)量詞(如 *, +)是貪婪的(盡可能多匹配),添加 ? 可改為非貪婪模式:
# 貪婪匹配 re.findall(r'<.*>', '<div>text</div>') # ['<div>text</div>'] # 非貪婪匹配 re.findall(r'<.*?>', '<div>text</div>') # ['<div>', '</div>']
**(2) 命名分組**
使用 (?P<name>...) 定義命名分組,通過 group('name') 訪問:
text = "ID: 123, Name: Alice"
match = re.search(r'ID: (?P<id>\d+), Name: (?P<name>\w+)', text)
print(match.group('id')) # '123'
print(match.group('name')) # 'Alice'5. 常見問題與注意事項(xiàng)
?轉(zhuǎn)義字符:在正則表達(dá)式中使用
\需寫成\\,或使用原始字符串r''簡化:python
re.match(r'\d+', '123') # 正確(原始字符串) re.match('\\d+', '123') # 正確(常規(guī)字符串需轉(zhuǎn)義)?性能優(yōu)化:
- 多次使用同一模式時(shí),預(yù)編譯正則表達(dá)式(
re.compile())。 - 避免過度復(fù)雜的正則表達(dá)式(如深層嵌套量詞)。
- 多次使用同一模式時(shí),預(yù)編譯正則表達(dá)式(
?匹配失敗處理:檢查
Match對(duì)象是否為None避免異常:python
match = re.search(r'\d+', 'abc') if match: print(match.group())
6. 應(yīng)用場景
- ?數(shù)據(jù)提取:從日志、HTML、JSON 中提取特定字段。
- ?輸入驗(yàn)證:檢查郵箱、電話、密碼格式是否合法。
- ?文本清洗:替換敏感詞、標(biāo)準(zhǔn)化日期格式。
- ?復(fù)雜搜索:查找符合特定模式的字符串片段。
?7. 總結(jié)
- ?核心功能:
re模塊通過正則表達(dá)式實(shí)現(xiàn)高效的字符串模式操作。 - ?常用函數(shù):
match()、search()、findall()、sub()、split()。 - ?匹配對(duì)象:利用
group()、groups()提取分組內(nèi)容。 - ?高級(jí)特性:非貪婪匹配、命名分組、預(yù)編譯優(yōu)化。
到此這篇關(guān)于python正則表達(dá)式標(biāo)準(zhǔn)庫之re庫的文章就介紹到這了,更多相關(guān)python re庫介紹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
手把手教你用Python中的Linting提高代碼質(zhì)量
Python是一種不斷發(fā)展的語言,隨著它的演化和擴(kuò)展,可用工具和開發(fā)策略的數(shù)量也在增加,近來流行的一個(gè)過程是linting—檢查代碼的潛在問題,下面這篇文章主要給大家介紹了關(guān)于用Python中Linting提高代碼質(zhì)量的相關(guān)資料,需要的朋友可以參考下2023-01-01
python基礎(chǔ)練習(xí)之幾個(gè)簡單的游戲
這篇文章主要介紹了python基礎(chǔ)練習(xí)之幾個(gè)簡單的游戲,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Python學(xué)習(xí)思維導(dǎo)圖(必看篇)
下面小編就為大家?guī)硪黄狿ython學(xué)習(xí)思維導(dǎo)圖(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
對(duì)python創(chuàng)建及引用動(dòng)態(tài)變量名的示例講解
今天小編就為大家分享一篇對(duì)python創(chuàng)建及引用動(dòng)態(tài)變量名的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
基于python解析XML文件并將數(shù)據(jù)存儲(chǔ)到MongoDB的代碼示例
在軟件開發(fā)中,我們經(jīng)常需要處理各種格式的數(shù)據(jù),XML 是一種常用的數(shù)據(jù)交換格式,它可以存儲(chǔ)和傳輸結(jié)構(gòu)化數(shù)據(jù),很多網(wǎng)站會(huì)提供 XML 格式的數(shù)據(jù)接口,以便其他系統(tǒng)可以方便地獲取數(shù)據(jù),本文介紹了基于python解析XML文件并將數(shù)據(jù)存儲(chǔ)到MongoDB的代碼示例,需要的朋友可以參考下2024-06-06
Python裝飾器實(shí)現(xiàn)函數(shù)運(yùn)行時(shí)間的計(jì)算
這篇文章主要為大家詳細(xì)介紹了Python函數(shù)運(yùn)行時(shí)間的計(jì)算,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
Python機(jī)器學(xué)習(xí)應(yīng)用之樸素貝葉斯篇
樸素貝葉斯模型是一組非常簡單快速的分類算法,通常適用于維度非常高的數(shù)據(jù)集。因?yàn)檫\(yùn)行速度快,而且可調(diào)參數(shù)少,因此非常適合為分類問題提供快速粗糙的基本方案2022-01-01

