Python re模塊的常用函數(shù)和正則表達(dá)式核心語法
一、核心前提:re 模塊常用函數(shù)速查
| 函數(shù) | 作用 | 核心參數(shù) | 返回值 | 場景 |
|---|---|---|---|---|
re.match(pattern, string) | 從字符串開頭匹配 | pattern(正則表達(dá)式)、string(目標(biāo)字符串) | 匹配對象 / None | 前綴驗證(如手機(jī)號、郵箱前綴) |
re.search(pattern, string) | 字符串任意位置匹配(首次) | 同上 | 匹配對象 / None | 提取任意位置的目標(biāo)內(nèi)容 |
re.findall(pattern, string) | 匹配所有符合規(guī)則的內(nèi)容 | 同上 | 列表(含所有匹配結(jié)果) | 批量提?。ㄈ缢墟溄?、手機(jī)號) |
re.finditer(pattern, string) | 迭代器形式返回所有匹配 | 同上 | 迭代器(含匹配對象) | 大量數(shù)據(jù)提取(省內(nèi)存) |
re.sub(pattern, repl, string) | 替換匹配內(nèi)容 | 新增 repl(替換字符串 / 函數(shù)) | 替換后的字符串 | 清洗數(shù)據(jù)(如去除特殊字符) |
re.compile(pattern) | 編譯正則表達(dá)式 | pattern | 編譯后的正則對象 | 重復(fù)使用同一正則(提效) |
關(guān)鍵說明:
- 匹配對象常用方法:
group()(獲取匹配結(jié)果)、groups()(獲取分組結(jié)果)、span()(獲取匹配位置); - 修飾符:
re.I(忽略大小寫)、re.S(. 匹配換行)、re.M(多行匹配),可組合使用(如re.I | re.S)。
二、正則語法核心片段
| 語法 | 說明 | 示例 | 匹配結(jié)果 |
|---|---|---|---|
^ | 字符串開頭 | ^1[3-9] | 匹配以 13-19 開頭的字符串 |
$ | 字符串結(jié)尾 | [0-9]$ | 匹配以數(shù)字結(jié)尾的字符串 |
. | 匹配任意字符(除換行) | a.b | 匹配 a + 任意字符 + b(如 acb、aab) |
* | 前面字符出現(xiàn) 0-∞ 次 | ab* | 匹配 a、ab、abb… |
+ | 前面字符出現(xiàn) 1-∞ 次 | ab+ | 匹配 ab、abb、abbb… |
? | 前面字符出現(xiàn) 0-1 次(非貪婪) | ab? | 匹配 a、ab |
{n} | 前面字符出現(xiàn) n 次 | a{3} | 匹配 aaa |
{n,m} | 前面字符出現(xiàn) n-m 次 | a{2,4} | 匹配 aa、aaa、aaaa |
[] | 字符集(匹配其中一個) | [a-zA-Z0-9] | 匹配字母 / 數(shù)字 |
[^] | 反向字符集 | [^0-9] | 匹配非數(shù)字字符 |
\d | 匹配數(shù)字(等價 [0-9]) | \d{3} | 匹配 123、456… |
\D | 匹配非數(shù)字 | \D+ | 匹配 abc、中文… |
\w | 匹配字母 / 數(shù)字 / 下劃線 | \w+ | 匹配 username123、test_abc |
\W | 匹配非字母 / 數(shù)字 / 下劃線 | \W | 匹配 @、#、空格… |
\s | 匹配空白字符(空格 / 制表符 / 換行) | \s+ | 匹配多個空白 |
\S | 匹配非空白字符 | \S+ | 匹配非空白內(nèi)容 |
() | 分組(提取目標(biāo)內(nèi)容) | (\d{3})-(\d{4}) | 分組 1 匹配前 3 位,分組 2 匹配后 4 位 |
| ` | ` | 或邏輯 | `abc |
三、場景:判斷與提取
所有場景均基于 re 模塊,直接復(fù)制可用,標(biāo)注「判斷」「提取」明確用途。
場景 1:手機(jī)號判斷與提取
- 規(guī)則:11 位數(shù)字,以 13/14/15/17/18/19 開頭
import re
def check_phone(phone):
"""判斷是否為有效手機(jī)號(返回布爾值)"""
pattern = r'^1[3-9]\d{9}$' # ^$ 嚴(yán)格匹配整個字符串
return bool(re.match(pattern, phone))
def extract_phones(text):
"""從文本中提取所有手機(jī)號(返回列表)"""
pattern = r'1[3-9]\d{9}' # 無需^$,匹配任意位置
return re.findall(pattern, text)
# 測試
print(check_phone("13812345678")) # True
print(extract_phones("聯(lián)系電話:13987654321,備用15600001111")) # ['13987654321', '15600001111']
場景 2:郵箱判斷與提取
- 規(guī)則:用戶名 @域名(支持字母、數(shù)字、下劃線、點號)
def check_email(email):
"""判斷是否為有效郵箱"""
pattern = r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+.[a-zA-Z]{2,6}$'
return bool(re.match(pattern, email))
def extract_emails(text):
"""提取文本中所有郵箱"""
pattern = r'[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+.[a-zA-Z]{2,6}'
return re.findall(pattern, text)
# 測試
print(check_email("test123@example.com")) # True
print(extract_emails("郵箱:user_name@qq.com,工作郵箱work.123@gmail.com")) # ['user_name@qq.com', 'work.123@gmail.com']
場景 3:提取 URL 鏈接
- 規(guī)則:匹配 http/https 開頭的鏈接
def extract_urls(text): pattern = r'https?://[^\s]+' # http或https開頭,直到空白字符結(jié)束 return re.findall(pattern, text) # 測試 text = "推薦網(wǎng)站:https://www.csdn.net,文檔https://docs.python.org" print(extract_urls(text)) # ['https://www.csdn.net', 'https://docs.python.org']
場景 4:提取身份證號(18 位)
- 規(guī)則:17 位數(shù)字 + 最后 1 位(數(shù)字 / X/x)
def extract_id_cards(text):
pattern = r'\d{17}[\dXx]'
return re.findall(pattern, text)
# 測試
text = "身份證:110101199001011234,備用22020219800202567X"
print(extract_id_cards(text)) # ['110101199001011234', '22020219800202567X']
場景 5:提取中文(含短語)
def extract_chinese(text): pattern = r'[\u4e00-\u9fa5]+' # 中文Unicode范圍 return re.findall(pattern, text) # 測試 text = "Python正則表達(dá)式提取中文:你好,世界!123abc" print(extract_chinese(text)) # ['正則表達(dá)式提取中文', '你好', '世界']
場景 6:提取數(shù)字(整數(shù) + 小數(shù))
def extract_numbers(text): pattern = r'-?\d+.?\d*' # 支持負(fù)數(shù)、整數(shù)、小數(shù) return re.findall(pattern, text) # 測試 text = "價格:99元,折扣價89.9元,虧損-10.5元" print(extract_numbers(text)) # ['99', '89.9', '-10.5']
場景 7:驗證密碼強(qiáng)度(判斷)
- 規(guī)則:8-16 位,含字母 + 數(shù)字 + 特殊字符(@#$%^&*)
def check_password_strength(password):
"""判斷密碼是否符合強(qiáng)密碼規(guī)則"""
# 三個條件同時滿足:長度8-16、含字母、含數(shù)字、含特殊字符
pattern = r'^(?=.*[a-zA-Z])(?=.*\d)(?=.*[@#$%^&*])[a-zA-Z0-9@#$%^&*]{8,16}$'
return bool(re.match(pattern, password))
# 測試
print(check_password_strength("Test123@")) # True
print(check_password_strength("weakpassword")) # False(無數(shù)字和特殊字符)
四、高級技巧:分組提取與非貪婪匹配
1. 分組提取
例如:提取「姓名:張三,年齡:25」中的姓名和年齡
text = "用戶信息:姓名:張三,年齡:25,性別:男"
pattern = r'姓名:([^\u4e00-\u9fa5]+),年齡:(\d+)' # 分組1匹配姓名,分組2匹配年齡
result = re.search(pattern, text)
if result:
name = result.group(1)
age = result.group(2)
print(f"姓名:{name},年齡:{age}") # 姓名:張三,年齡:25
2. 非貪婪匹配
問題:.* 默認(rèn)貪婪(匹配盡可能多的內(nèi)容),需用 .*? 非貪婪
例如,正則表達(dá)式 a.*b 在字符串 ‘a123b456b’ 中,.* 會一口氣吃掉從第一個 a 之后到最后一個 b 之前的所有字符,最終匹配的是 ‘a123b456b’ 整個子串,而不是我們可能期望的 ‘a123b’。
非貪婪匹配:在量詞后面加上 ?,量詞會盡可能少地重復(fù)匹配,只要能讓整個表達(dá)式匹配成功。正則表達(dá)式改為 a.*?b ,得到 ‘a123b’。
| 貪婪寫法 | 非貪婪寫法 | 說明 |
|---|---|---|
| * | *? | 零次或多次,盡可能少 |
| + | +? | 一次或多次,盡可能少 |
| ? | ?? | 零次或一次,傾向于零次 |
| {m,n} | {m,n}? | 至少 m 次,至多 n 次,盡可能少 |
# 提取 HTML 標(biāo)簽內(nèi)容
html = '<div>第一段</div><div>第二段</div>'
# 貪婪匹配:.* 會匹配到最后一個 </div>
greedy_tags = re.findall(r'<div>(.*)</div>', html)
print("貪婪匹配提取內(nèi)容:", greedy_tags) # 輸出: ['第一段</div><div>第二段']
# 非貪婪匹配:.*? 只匹配到最近的 </div>
non_greedy_tags = re.findall(r'<div>(.*?)</div>', html)
print("非貪婪匹配提取內(nèi)容:", non_greedy_tags) # 輸出: ['第一段', '第二段']
在正則表達(dá)式中,? 有兩種用法:
- 作為普通量詞,表示“零次或一次”(貪婪)。
- 跟在其他量詞后面,表示將貪婪變?yōu)榉秦澙罚☉卸瑁?/li>
例如:
- .*? 表示“任意字符重復(fù)零次或多次,但盡可能少”。
- .+? 表示“任意字符重復(fù)一次或多次,但盡可能少”。
- a?? 表示“匹配一個 a 或零個 a,但優(yōu)先零個”。
# ?? 示例:匹配兩個字符,但盡可能少 print(re.findall(r'a??', 'aa')) # 輸出: ['', 'a', ''] 因為第一個位置優(yōu)先匹配0個a
五、常見問題與避坑指南
- 匹配不到換行符:
問題:. 默認(rèn)不匹配換行,需加修飾符 re.S
示例:re.search(r'a.b', 'a\nb', re.S) → 匹配成功
- 忽略大小寫匹配:
加修飾符 re.I,示例:re.match(r'abc', 'ABC', re.I) → 匹配成功
- 正則中有特殊字符(如 . * ?):
需轉(zhuǎn)義(加 \)或用 re.escape() 自動轉(zhuǎn)義
示例:匹配 www.baidu.com → pattern = r'www\.baidu\.com' 或 pattern = re.escape('www.baidu.com')
- 重復(fù)使用同一正則:
用 re.compile() 編譯,提升效率
示例:
pattern = re.compile(r'1[3-9]\d{9}')
print(pattern.match("13812345678")) # 直接使用編譯后的對象
print(pattern.findall("聯(lián)系電話13987654321"))
六、常用
| 需求 | 正則表達(dá)式 | Python 代碼片段 |
|---|---|---|
| 判斷手機(jī)號 | ^1[3-9]\d{9}$ | re.match(r'^1[3-9]\d{9}$', phone) |
| 判斷郵箱 | ^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+.[a-zA-Z]{2,6}$ | re.match(r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+.[a-zA-Z]{2,6}$', email) |
| 提取手機(jī)號 | 1[3-9]\d{9} | re.findall(r'1[3-9]\d{9}', text) |
| 提取郵箱 | [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+.[a-zA-Z]{2,6} | re.findall(r'[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+.[a-zA-Z]{2,6}', text) |
| 提取中文 | [\u4e00-\u9fa5]+ | re.findall(r'[\u4e00-\u9fa5]+', text) |
| 提取數(shù)字(含小數(shù)) | -?\d+.?\d* | re.findall(r'-?\d+.?\d*', text) |
| 提取 URL | https?://[^\s]+ | re.findall(r'https?://[^\s]+', text) |
以上就是Python正則表達(dá)式備忘錄判斷與提取核心用法的詳細(xì)內(nèi)容,更多關(guān)于Python正則表達(dá)式備忘錄的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實現(xiàn)批量將MP3音頻轉(zhuǎn)為WAV格式詳解
這篇文章主要介紹了通過Python實現(xiàn)將MP3音頻轉(zhuǎn)為WAV格式的方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,感興趣的可以了解一下2021-12-12
Python3.6 + TensorFlow 安裝配置圖文教程(Windows 64 bit)
這篇文章主要介紹了Python3.6 + TensorFlow 安裝配置的教程(Windows 64 bit),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
在Python中獲取兩數(shù)相除的商和余數(shù)方法
今天小編就為大家分享一篇在Python中獲取兩數(shù)相除的商和余數(shù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
在Linux中通過Python腳本訪問mdb數(shù)據(jù)庫的方法
這篇文章主要介紹了在Linux中通過Python腳本訪問mdb數(shù)據(jù)庫的方法,本文示例基于debian系的Linux系統(tǒng),需要的朋友可以參考下2015-05-05
Python實現(xiàn)數(shù)據(jù)可視化大屏布局的示例詳解
數(shù)據(jù)可視化大屏展示需求無疑是對數(shù)據(jù)分析結(jié)果最好的詮釋,能夠使得別人能夠輕松的就理解我們的數(shù)據(jù)意圖。本文將通過pyecharts模塊來實現(xiàn),感興趣的可以了解一下2022-11-11
Python基于火山引擎豆包大模型搭建QQ機(jī)器人詳細(xì)教程(2024年最新)
這篇文章主要介紹了Python基于火山引擎豆包大模型搭建QQ機(jī)器人詳細(xì)的相關(guān)資料,包括開通模型、配置APIKEY鑒權(quán)和SDK安裝等步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01

