Python數(shù)據(jù)分析中正則表達式匹配字符串與常用函數(shù)示例詳解
前言
在真實的數(shù)據(jù)分析項目中,原始數(shù)據(jù)往往“臟亂差”——包含大量非結(jié)構(gòu)化文本,如用戶評論、日志、網(wǎng)頁抓取內(nèi)容等。如何從中精準(zhǔn)提取電話號碼、郵箱、日期、金額等關(guān)鍵信息?答案就是:正則表達式(Regular Expression)。
Python 通過標(biāo)準(zhǔn)庫 re 提供了強大而靈活的正則支持。本文將系統(tǒng)講解正則在數(shù)據(jù)分析中的核心用法,涵蓋:
- 字符串匹配函數(shù)(match、search、findall)
- 正則語法(字符范圍、重復(fù)次數(shù)、字符類)
- 貪婪與非貪婪模式
- 分組與邏輯“或”
- 替換與編譯優(yōu)化(sub、compile)
一、匹配字符串:三大核心函數(shù)
1.re.match():從字符串開頭匹配
- 作用:僅檢查字符串起始位置是否匹配正則模式。
- 返回值:匹配成功返回
Match對象,否則None。
使用形式:
re.match(參數(shù)1,參數(shù)2)
功能:表示從參數(shù)2(字符串類型數(shù)據(jù))中查找滿足參數(shù)1(正則表達式)的內(nèi)容。
實例代碼:
import re
messaga = '張三、李四、王五、趙六、張三'
result = re.match('張三', messaga)
print(result)
result1 = re.match('李四', messaga)
print(result1)代碼執(zhí)行結(jié)果:

- span=(0,2)表示字符串索引號為0~2的位置匹配成功。
- match='張三'表示匹配的內(nèi)容為張三。
2.re.search():全文搜索首次匹配
- 作用:在整個字符串中查找第一個匹配項。
- 返回值:首個匹配的
Match對象,或None。
使用形式:
re.search(參數(shù)1,參數(shù)2)
功能:表示從參數(shù)2(字符串類型數(shù)據(jù))中查找滿足參數(shù)1(正則表達式)的內(nèi)容,如果匹配了多個參數(shù)1,則只返回第一個匹配成功的信息。
示例代碼:
messaga1 = '張三、李四、王五、趙六、王五'
result2 = re.search('王五', messaga1)
print(result2)代碼執(zhí)行結(jié)果:

只返回第一個匹配成功的信息。
3.re.findall():查找所有匹配項
- 作用:返回所有非重疊匹配結(jié)果的列表。
- 返回值:字符串列表(若無分組);元組列表(若有多個分組)。
使用形式:
re.findall(參數(shù)1,參數(shù)2)
功能:表示從參數(shù)2(字符串類型數(shù)據(jù))中查找滿足參數(shù)1(正則表達式)的內(nèi)容,如果匹配了多個參數(shù)1,則返回匹配成功的全部信息。
import re
messaga1 = '張三、李四、王五、趙六、王五'
result3 = re.findall('王五', messaga1)
print(result3)
運行結(jié)果:
['王五','王五']findall()并不返回匹配的位置,只返回匹配的全部內(nèi)容。
二、正則表達式基礎(chǔ)語法
表示字符范圍:[...]
用方括號定義可接受的字符集合:
| 表達式 | 含義 |
|---|---|
[abc] | 匹配 a、b 或 c |
[a-z] | 匹配任意小寫字母 |
[0-9] | 等價于 \d,匹配數(shù)字 |
[^0-9] | 取反,匹配非數(shù)字字符 |
示例:
import re
message = 'Pythonnnnncc93,c87,Javac63,C++88'
result_1 = re.search('[cn]', message) # 只返回第一個匹配成功的信息
result_2 = re.findall('[0-9]', message)
result_3 = re.findall('[cn]*[0-9]', message)
print(result_1)
print(result_2)
print(result_3)運行結(jié)果:

表示字符出現(xiàn)的次數(shù)(量詞)
| 符號 | 含義 | 示例 |
|---|---|---|
* | 0 次或多次 | ab* → "a", "ab", "abb" |
+ | 1 次或多次 | \d+ → 至少一個數(shù)字 |
? | 0 次或 1 次 | colou?r → "color" / "colour" |
{n} | 恰好 n 次 | \d{4} → 四位年份 |
{n,} | 至少 n 次 | \d{3,} → 三位及以上數(shù)字 |
{n,m} | n 到 m 次 | \d{2,4} → 2~4 位數(shù)字 |
示例:
import re
message1 = 'da2a7ddbre77yifed777t3fefd777b'
result = re.findall('[a-z]*[0-9][a-z]', message1)
print(result)運行結(jié)果:

表示同一類字符(預(yù)定義字符類)
| 符號 | 等價寫法 | 含義 |
|---|---|---|
\d | [0-9] | 數(shù)字 |
\D | [^0-9] | 非數(shù)字 |
\w | [a-zA-Z0-9_] | 單詞字符(字母、數(shù)字、下劃線) |
\W | [^a-zA-Z0-9_] | 非單詞字符 |
\s | [ \t\n\r\f\v] | 空白字符 |
\S | [^\t\n\r\f\v] | 非空白字符 |
\b | 單詞邊界,即單詞中與空格鄰接的字符 | |
\B | 非單詞邊界 | |
\f | 分頁符 | |
\n | 換行符 | |
\r | 回車符 | |
\t | 制表符 | |
\v | 垂直制表符 | |
.: | 匹配除"\n"和"\r"之外的任何單個字符 |
示例:清洗文本中的非字母數(shù)字字符
import re text = "Hello, World! 123 @#$" clean = re.sub(r"\W", " ", text) # \W = 非單詞字符 print(clean) # "Hello World 123 "
三、貪婪模式 vs 非貪婪模式
貪婪和非貪婪模式指是否匹配更多內(nèi)容,具體使用如下:
- 默認是貪婪模式:盡可能多地匹配字符。
- 非貪婪(惰性)模式:在量詞后加
?,盡可能少匹配。
text = "<div>Hello</div><div>World</div>" # 貪婪:匹配整個字符串 print(re.search(r"<div>.*</div>", text).group()) # 輸出:<div>Hello</div><div>World</div> # 非貪婪:只匹配第一個標(biāo)簽 print(re.search(r"<div>.*?</div>", text).group()) # 輸出:<div>Hello</div>
數(shù)據(jù)分析提示:提取 HTML/XML 標(biāo)簽、JSON 片段時,務(wù)必使用非貪婪模式!
四、 “或” 和 分組(Grouping)
邏輯“或”:|
re.findall(r"jpg|png|gif", "image1.jpg, image2.png, icon.gif") # 輸出:['jpg', 'png', 'gif']
分組:(...)與捕獲
用括號將模式分組,便于提取子內(nèi)容:
date_str = "2025-04-05"
match = re.search(r"(\d{4})-(\d{2})-(\d{2})", date_str)
print(match.groups()) # ('2025', '04', '05')
print(match.group(1)) # '2025'(年)五、sub()和compile()方法
re.sub():替換匹配內(nèi)容
- 作用:將匹配到的文本替換為指定字符串。
- 語法:
re.sub(pattern, repl, string)
import re
text = "Call me at 138****5678"
cleaned = re.sub(r"\d{3}\*\*\*\d{4}", "[PHONE_HIDDEN]", text)
print(cleaned) # Call me at [PHONE_HIDDEN]支持使用分組引用(\1, \2):
import re text = "John Doe" swapped = re.sub(r"(\w+) (\w+)", r"\2, \1", text) print(swapped) # Doe, John
re.compile():預(yù)編譯正則(提升性能)
當(dāng)同一正則需多次使用(如處理百萬行數(shù)據(jù)),應(yīng)先編譯:
phone_pattern = re.compile(r"1[3-9]\d{9}")
# 后續(xù)可直接調(diào)用
if phone_pattern.search(text1):
...
if phone_pattern.findall(text2):
...綜合案例:
給定字符串 log_info = "用戶ID:10086,訂單號:ORD20260122001,支付金額:99.9元;用戶ID:10087,訂單號:ORD20260122002,支付金額:199.5元;用戶ID:10088,訂單號:ORD20260122003,支付金額:0.88元"
1、基礎(chǔ)匹配:提取所有的用戶 ID 數(shù)字(如 10086、10087、10088),并以列表形式輸出。
2、捕獲組 + 貪婪 / 非貪婪:提取所有的訂單號(如 ORD20260122001),要求分別用貪婪匹配和非貪婪匹配實現(xiàn),并對比兩種方式的結(jié)果(思考為什么結(jié)果一致 / 不一致)。
3、數(shù)值提?。禾崛∷械闹Ц督痤~數(shù)字(僅保留數(shù)字部分,如 99.9、199.5、0.88),忽略 “元” 字,最終輸出浮點數(shù)列表。
實現(xiàn)代碼:
import re
log_info = "用戶ID:10086,訂單號:ORD20260122001,支付金額:99.9元;用戶ID:10087,訂單號:ORD20260122002,支付金額:199.5元;用戶ID:10088,訂單號:ORD20260122003,支付金額:0.88元"
pattern1 = re.compile(':(\d+),')
print(pattern1.findall(log_info))
pattern2 = re.compile('ORD\d+') # 貪婪模式
print(pattern2.findall(log_info))
pattern3 = re.compile('ORD2026012200\d+?') # 非貪婪模式
print(pattern3.findall(log_info))
pattern4 = re.compile(':(\d+.\d+)元')
print(pattern4.findall(log_info))結(jié)語
記住口訣:
- 提取一個用
search,- 提取多個用
findall,- 替換內(nèi)容用
sub,- 高頻使用要
compile!
總結(jié)
到此這篇關(guān)于Python數(shù)據(jù)分析中正則表達式匹配字符串與常用函數(shù)的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)分析正則表達式匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pytorch中的數(shù)據(jù)轉(zhuǎn)換Transforms與DataLoader方式
這篇文章主要介紹了Pytorch中的數(shù)據(jù)轉(zhuǎn)換Transforms與DataLoader方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
python實現(xiàn)同一局域網(wǎng)下傳輸圖片
這篇文章主要為大家詳細介紹了python實現(xiàn)同一局域網(wǎng)下傳輸圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03
Python實現(xiàn)清理重復(fù)文件功能的示例代碼
在電腦上或多或少的存在一些重復(fù)文件,體積小的倒沒什么,如果體積大的就很占內(nèi)存了。本文用python制作了一個刪除重復(fù)文件的小工具,核心代碼很簡單,希望對你有所幫助2022-07-07

