Python?re模塊的使用全過程
一、模塊簡介
re
模塊是 Python 標(biāo)準(zhǔn)庫中處理正則表達(dá)式的核心工具,提供強大的文本模式匹配、搜索和替換功能。通過特定的語法規(guī)則,可以快速完成以下任務(wù):
- 數(shù)據(jù)驗證(郵箱/手機號格式校驗)
- 文本內(nèi)容提?。ㄈ罩痉治?網(wǎng)頁爬蟲)
- 批量文本處理(格式轉(zhuǎn)換/敏感詞過濾)
- 復(fù)雜字符串操作(多條件分割/模板替換)
正則表達(dá)式引擎基于 PCRE(Perl Compatible Regular Expressions)實現(xiàn)
二、核心功能
- 函數(shù)介紹:
函數(shù)名稱 | 匹配范圍 | 返回類型 | 適用場景 | 性能特點 |
---|---|---|---|---|
re.match | 僅字符串開頭 | Match/None | 格式校驗 | 快速失敗 |
re.search | 全局首次匹配 | Match/None | 內(nèi)容提取 | 中等性能 |
re.findall | 所有非重疊匹配 | list | 批量數(shù)據(jù)收集 | 內(nèi)存消耗高 |
re.finditer | 所有非重疊匹配 | iterator | 大文本處理 | 內(nèi)存友好 |
re.split | 分割字符串 | list | 復(fù)雜分隔符處理 | 替代str.split |
re.compile | - | Pattern對象 | 高頻正則表達(dá)式復(fù)用 | 提升30%性能 |
三. 功能詳解
1. re.match(pattern, string, flags=0)
特點
- 僅匹配字符串開頭,如果不是起始位置匹配成功的話,
match()
就返回None
。 - 相當(dāng)于自動添加
^
錨點
參數(shù)說明
參數(shù) | 描述 |
---|---|
pattern | 匹配的正則表達(dá)式 |
string | 要匹配的字符串。 |
flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見:正則表達(dá)式修飾符 - 可選標(biāo)志 |
返回值
- 成功:
re.Match
對象,使用group(num)
或groups()
匹配對象函數(shù)來獲取匹配表達(dá)式 - 失?。?code>None
匹配對象方法 | 描述 |
---|---|
group(num=0) | 匹配的整個表達(dá)式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應(yīng)值的元組。 |
groups() | 返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。 |
- 使用案例
# 驗證字符串是否以數(shù)字開頭,調(diào)用這個方法等同于 r'^\d+' # 如果匹配的字符串是c123abc,是匹配不到的 if re.match(r'\d+', '123abc'): print("Valid header") else: print("Invalid header") # 提取開頭的版本號 version = re.match(r'v?(\d+\.\d+)', 'v3.8.1').group(1) # '3.8'
2. re.search(pattern, string, flags=0)
特點
- 掃描整個字符串尋找第一個匹配
- 支持復(fù)雜定位邏輯
參數(shù)與返回:同re.match
使用案例
# 查找第一個有效數(shù)字串,只匹配第一個 text = "Total: 1500 items, price $299" match = re.search(r'\d+', text) if match: print(f"價格:{match.group()}") # 1500 # 帶條件的搜索 pattern = r'(?<=ID:)\s*[A-Z0-9]{8}' # 查找ID后的8位編碼 id_code = re.search(pattern, "User ID: AB3XK9P2").group() # AB3XK9P2
3. re.compile(pattern, flags=0)
特點
- 預(yù)編譯正則表達(dá)式,生成一個正則表達(dá)式( Pattern )對象
- 適合高頻調(diào)用場景
參數(shù)說明:
pattern
: 一個字符串形式的正則表達(dá)式flags
可選,表示匹配模式,比如忽略大小寫,多行模式等,具體參數(shù)為:re.IGNORECASE
或re.I
- 使匹配對大小寫不敏感re.L
表示特殊字符集\w, \W, \b, \B, \s, \S
依賴于當(dāng)前環(huán)境re.MULTILINE
或re.M
- 多行模式,改變^
和$
的行為,使它們匹配字符串的每一行的開頭和結(jié)尾。re.DOTALL
或re.S
- 使.
匹配包括換行符在內(nèi)的任意字符。re.ASCII
- 使\w, \W, \b, \B, \d, \D, \s, \S
僅匹配ASCII
字符。re.VERBOSE
或re.X
- 忽略空格和注釋,可以更清晰地組織復(fù)雜的正則表達(dá)式。
這些標(biāo)志可以單獨使用,也可以通過按位或(|)
組合使用。例如,re.IGNORECASE | re.MULTILINE
表示同時啟用忽略大小寫和多行模式。
返回:re.Pattern
對象
使用案例
# 預(yù)編譯郵箱驗證正則 email_re = re.compile( r'''( [\w\.-]+ # 用戶名 @ [\w\.-]+ # 域名 \. [a-zA-Z]{2,4} # 頂級域名 )''', re.VERBOSE) # 復(fù)用編譯對象 valid = email_re.match('user@example.com') is not None # True
案例調(diào)用match
匹配成功時返回一個 Match
對象,其中:
group([group1, …])
方法用于獲得一個或多個分組匹配的字符串,當(dāng)要獲得整個匹配的子串時,可直接使用group()
或group(0)
;start([group])
方法用于獲取分組匹配的子串在整個字符串中的起始位置(子串第一個字符的索引),參數(shù)默認(rèn)值為0
;end([group])
方法用于獲取分組匹配的子串在整個字符串中的結(jié)束位置(子串最后一個字符的索引+1),參數(shù)默認(rèn)值為0
;span([group])
方法返回(start(group), end(group))
。
4. re.findall(pattern, string, flags=0)
特點:在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個列表,如果有多個匹配模式,則返回元組列表,如果沒有找到匹配的,則返回空列表。
^注意: match 和 search 是匹配一次 findall 匹配所有。
參數(shù)說明
pattern
匹配模式。string
待匹配的字符串。pos
可選參數(shù),指定字符串的起始位置,默認(rèn)為 0。endpos
可選參數(shù),指定字符串的結(jié)束位置,默認(rèn)為字符串的長度。
返回值
- 無分組:匹配字符串列表 [‘a’, ‘b’, …]
- 有分組:分組元組列表 [(‘a’, ‘1’), …]
使用案例
# 提取所有數(shù)字 numbers = re.findall(r'\d+', 'A1B23C456') print(numbers) # ['1','23','456'] # 分組提取日期成分 dates = re.findall(r'(\d{4})-(\d{2})-(\d{2})', '2023-08-01, 2025-03-15') print(dates) # [('2023','08','01'), ('2025', '03', '15')]
5. re.finditer(pattern, string, flags=0)
特點
- 和 findall 類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個迭代器返回
- 處理大文本時內(nèi)存更高效
參數(shù) | 描述 |
---|---|
pattern | 匹配的正則表達(dá)式 |
string | 要匹配的字符串。 |
flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見:正則表達(dá)式修飾符 - 可選標(biāo)志 |
- 返回值:
callable_iterator
對象 - 使用案例
# 處理100MB日志文件 with open('server.log') as f: for match in re.finditer(r'$$(ERROR|WARN)$$.*?(req_id=\w+)', f.read()): level = match.group(1) req_id = match.group(2) print(f"{level}報警:{req_id}")
6. re.split(pattern, string, maxsplit=0, flags=0)
特點
- split 方法按照能夠匹配的子串將字符串分割后返回列表
- 保留分割符內(nèi)容(使用分組時)
參數(shù)說明
參數(shù) | 描述 |
---|---|
pattern | 匹配的正則表達(dá)式 |
string | 要匹配的字符串。 |
maxsplit | 分割次數(shù),maxsplit=1 分割一次,默認(rèn)為 0,不限制次數(shù)。 |
flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見:正則表達(dá)式修飾符 - 可選標(biāo)志 |
- 使用案例
# 復(fù)雜分隔符分割 text = "apple, banana;cherry|orange" parts = re.split(r'[,;|]\s*', text) # ['apple','banana','cherry','orange'] # 帶保留分隔符的分割 re.split(r'([,;])', 'a,b;c') # ['a', ',', 'b', ';', 'c'] # 控制分割次數(shù) re.split(r'\d+', 'a1b22c333d', maxsplit=2) # ['a','b','c333d']
四、綜合應(yīng)用案例
日志分析系統(tǒng)
log_pattern = re.compile(r''' (?P<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}) # 時間 \s\|\s (?P<level>INFO|ERROR|WARN) # 日志級別 \s\|\s (?P<module>\w+)\.py # 模塊 :(?P<line>\d+) # 行號 \s-\s (?P<msg>.+) # 消息 ''', re.VERBOSE) for log in open('app.log'): if (match := log_pattern.search(log)): print(f"{match.group('time')} [{match.group('level')}]", f"{match.group('module')}:{match.group('line')}", match.group('msg'))
五、正則表達(dá)式修飾符 - 可選標(biāo)志
正則表達(dá)式可以包含一些可選標(biāo)志修飾符來控制匹配的模式。
以下標(biāo)志可以單獨使用,也可以通過按位或(|)
組合使用。
例如:re.IGNORECASE | re.MULTILINE
表示同時啟用忽略大小寫和多行模式。
最佳實踐建議
- ?優(yōu)先使用編譯對象:當(dāng)正則使用超過3次時
- ?合理使用分組:避免過多捕獲組影響性能
- ?注意貪婪匹配:非貪婪模式
.*?
可避免意外匹配 - ?處理特殊字符:用
re.escape()
處理動態(tài)輸入 - 控制回溯次數(shù):復(fù)雜正則可能引發(fā)性能問題
完整API文檔:Python re模塊官方文檔
模塊 | 功能說明 |
---|---|
用戶管理 | 1. 注冊登錄2. 權(quán)限控制3. 資料修改 |
訂單系統(tǒng) |
|
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python 非極大值抑制(NMS)的四種實現(xiàn)詳解
本文主要介紹了非極大值抑制(Non-Maximum Suppression,NMS)的四種實現(xiàn)方式,不同方法對NMS速度的影響各不相同,感興趣的小伙伴可以了解一下2021-11-11對pandas讀取中文unicode的csv和添加行標(biāo)題的方法詳解
今天小編就為大家分享一篇對pandas讀取中文unicode的csv和添加行標(biāo)題的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12python用tkinter實現(xiàn)一個gui的翻譯工具
這篇文章主要介紹了python用tkinter實現(xiàn)一個gui的翻譯工具,幫助大家更好的理解和使用python,感興趣的朋友可以了解下 +2020-10-10Python數(shù)據(jù)可視化之matplotlib.pyplot繪圖的基本參數(shù)詳解
matplotlib.pyplot模塊是一個功能強大的畫圖模塊,可以對畫圖的多個參數(shù)進行調(diào)整,下面這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)可視化之matplotlib.pyplot繪圖基本參數(shù)的相關(guān)資料,需要的朋友可以參考下2022-04-04如何查看Django ORM執(zhí)行的SQL語句的實現(xiàn)
這篇文章主要介紹了如何查看Django ORM執(zhí)行的SQL語句的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04python調(diào)用動態(tài)鏈接庫的基本過程詳解
這篇文章主要介紹了python調(diào)用動態(tài)鏈接庫的基本過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Python零基礎(chǔ)入門學(xué)習(xí)之輸入與輸出
在之前的編程中,我們的信息打印,數(shù)據(jù)的展示都是在控制臺(命令行)直接輸出的,信息都是一次性的沒有辦法復(fù)用和保存以便下次查看,今天我們將學(xué)習(xí)Python的輸入輸出,解決以上問題2019-04-04