Python使用正則表達(dá)式實(shí)現(xiàn)從文本清洗到復(fù)雜信息提取的實(shí)戰(zhàn)指南
引言
在數(shù)據(jù)分析、爬蟲、日志解析、表單校驗(yàn)等開發(fā)場景中,正則表達(dá)式是處理文本的利器。相比于基礎(chǔ)字符串方法,正則能精準(zhǔn)實(shí)現(xiàn)模糊匹配、批量提取、復(fù)雜替換等操作。
Python 內(nèi)置 re 模塊,無需額外安裝第三方庫,開箱即用。本文在基礎(chǔ)用法之上,結(jié)合身份證、URL、中文提取、日志清洗、貪婪與非貪婪匹配等高頻實(shí)戰(zhàn)案例,帶你吃透正則進(jìn)階用法,輕松解決日常文本處理難題。
1. 模塊導(dǎo)入與核心概念
使用正則第一步,導(dǎo)入內(nèi)置 re 模塊:
import re
正則本質(zhì)是用一套符號(hào)規(guī)則描述字符串模式,支持匹配、查找、提取、替換、分割。 寫正則強(qiáng)烈建議使用原始字符串 r"",避免反斜杠 \ 雙重轉(zhuǎn)義,這是 Python 正則的最佳實(shí)踐。
2. re.match:精準(zhǔn)校驗(yàn)完整字符串
re.match(pattern, string) 從字符串開頭匹配,適合做格式校驗(yàn),比如身份證、手機(jī)號(hào)、賬號(hào)密碼格式驗(yàn)證。
實(shí)戰(zhàn):校驗(yàn) 18 位身份證號(hào)
身份證規(guī)則:前 17 位數(shù)字,最后一位可為數(shù)字或 X/x
id_card_pattern = r"^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$"
print(re.match(id_card_pattern, "34012320000101123X")) # 匹配成功
print(re.match(id_card_pattern, "123456")) # 匹配失敗
規(guī)則拆解:
^:字符串開頭,$:字符串結(jié)尾,嚴(yán)格匹配完整文本[1-9]\d{5}:6 位地區(qū)碼(19|20)\d{2}:出生年份 19/20 開頭- 后續(xù)匹配月、日、順序碼 + 校驗(yàn)位
注意:match 只從開頭匹配,想在全文找內(nèi)容用 search。
3. re.search:全文查找首個(gè)匹配項(xiàng)
re.search() 掃描整個(gè)字符串,找到第一個(gè)符合規(guī)則的內(nèi)容就返回,適合從雜亂文本中提取單個(gè)信息。
實(shí)戰(zhàn):提取文本中的 URL 鏈接
text = "我的博客:https://blog.csdn.net,備用網(wǎng)址:http://www.example.com"
url = re.search(r"https?://\w+\.\w+", text)
if url:
print("提取到URL:", url.group())
輸出:
提取到URL: https://blog.csdn.net
正則解析:
https?:?匹配 0 次或 1 次,兼容 http/https://:固定協(xié)議符號(hào)\w+\.\w+:匹配域名主體 + 后綴
4. re.findall:批量提取所有匹配內(nèi)容
re.findall() 是最常用的提取方法,掃描全文,返回所有匹配結(jié)果的列表,適合批量提取數(shù)字、關(guān)鍵詞、鏈接、中文等。
實(shí)戰(zhàn) 1:提取所有中文
text = "Python正則2026實(shí)戰(zhàn),提取中文,123測試數(shù)據(jù)" chinese_list = re.findall(r"[\u4e00-\u9fa5]+", text) print(chinese_list)
輸出:
['正則', '實(shí)戰(zhàn)', '提取中文', '測試數(shù)據(jù)']
[\u4e00-\u9fa5] 是 Unicode 編碼,匹配所有中文字符。
實(shí)戰(zhàn) 2:提取所有數(shù)字
text = "訂單1:599元,訂單2:1299元,運(yùn)費(fèi)20元" nums = re.findall(r"\d+", text) print(nums) # ['599', '1299', '20']
5. re.sub:高級(jí)文本替換與脫敏
re.sub(pattern, repl, string, count=0) 實(shí)現(xiàn)批量替換,可用于數(shù)據(jù)脫敏、清洗無用字符、格式化文本。
實(shí)戰(zhàn) 1:手機(jī)號(hào)脫敏
text = "用戶1:13812345678,用戶2:15987654321"
# 中間4位替換為****
result = re.sub(r"(1[3-9]\d)\d{4}(\d{4})", r"\1****\2", text)
print(result)
輸出:
plaintext
用戶1:138****5678,用戶2:159****4321
核心:() 分組,\1、\2 反向引用分組內(nèi)容,精準(zhǔn)替換中間位。
實(shí)戰(zhàn) 2:清除文本中的特殊符號(hào)
text = "你好!@#¥%Python正則&*實(shí)戰(zhàn)~" result = re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9]", "", text) print(result) # 你好Python正則實(shí)戰(zhàn)
[^...] 表示非指定字符,清除所有非中文、非英文、非數(shù)字的符號(hào)。
6. re.split:多規(guī)則分割字符串
Python 原生 split() 只能按單個(gè)分隔符拆分,re.split() 支持多個(gè)分隔符、不定數(shù)量分隔符,處理臟數(shù)據(jù)更高效。
實(shí)戰(zhàn):分割雜亂日志文本
log = "2026-05-23;INFO,用戶登錄 賬號(hào):test 狀態(tài):成功" # 按分號(hào)、逗號(hào)、空格分割 parts = re.split(r"[;,\s]+", log) print(parts)
輸出:
['2026-05-23', 'INFO', '用戶登錄', '賬號(hào):test', '狀態(tài):成功']
7. 正則核心符號(hào)進(jìn)階詳解
除基礎(chǔ)符號(hào),進(jìn)階必學(xué)符號(hào),直接應(yīng)對復(fù)雜場景:
表格
| 符號(hào) | 含義 |
|---|---|
\u4e00-\u9fa5 | 匹配所有中文 |
? | 0 次或 1 次,非貪婪核心 |
{n,m} | 匹配 n~m 次(如\d{6,12}) |
() | 分組,用于提取局部內(nèi)容、反向引用 |
[^...] | 匹配非括號(hào)內(nèi)的字符 |
.*? | 非貪婪匹配(最短匹配) |
.* | 貪婪匹配(最長匹配) |
重點(diǎn):貪婪 vs 非貪婪匹配
html = "<div>標(biāo)題1</div><div>標(biāo)題2</div>" # 貪婪匹配:匹配到最后一個(gè)</div> res1 = re.findall(r"<div>.*</div>", html) # 非貪婪匹配:逐個(gè)匹配 res2 = re.findall(r"<div>.*?</div>", html) print(res1, res2)
正則中加?就是非貪婪,提取多組內(nèi)容必用!
8. 五大方法場景選型總結(jié)
表格
| 方法 | 適用場景 |
|---|---|
| re.match | 完整字符串格式校驗(yàn)(身份證、賬號(hào)) |
| re.search | 全文找第一個(gè)匹配項(xiàng) |
| re.findall | 批量提取所有匹配內(nèi)容(最常用) |
| re.sub | 文本替換、脫敏、清洗 |
| re.split | 多分隔符分割臟文本 |
9. 完整實(shí)戰(zhàn):日志文本清洗
綜合所有用法,解析一段真實(shí)日志,提取時(shí)間、級(jí)別、內(nèi)容:
log_text = """
2026-05-23 10:20:30 INFO: 用戶test登錄成功
2026-05-23 10:21:10 ERROR: 接口請求超時(shí)
2026-05-23 10:22:00 WARN: 內(nèi)存占用過高
"""
# 提取時(shí)間、日志級(jí)別、內(nèi)容
pattern = r"(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s(\w+):\s(.+)"
result = re.findall(pattern, log_text)
for item in result:
print(f"時(shí)間:{item[0]},級(jí)別:{item[1]},內(nèi)容:{item[2]}")
小結(jié)
本文從 Python 正則進(jìn)階用法出發(fā),覆蓋格式校驗(yàn)、批量提取、脫敏替換、臟數(shù)據(jù)分割、貪婪匹配、日志解析等實(shí)戰(zhàn)場景。 核心要點(diǎn):
- 正則優(yōu)先使用原始字符串
r""; - 批量提取用
findall,校驗(yàn)用match,替換用sub; - 多組內(nèi)容提取必須用非貪婪匹配
.*?; - 分組
()可精準(zhǔn)提取局部信息。
正則是文本處理的萬能工具,掌握基礎(chǔ)符號(hào) + 5 個(gè)核心方法,就能搞定 80% 的日常文本需求。
以上就是Python使用正則表達(dá)式實(shí)現(xiàn)從文本清洗到復(fù)雜信息提取的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Python正則表達(dá)式實(shí)戰(zhàn)指南的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 實(shí)現(xiàn)手機(jī)自動(dòng)撥打電話的方法(通話壓力測試)
今天小編就為大家分享一篇python 實(shí)現(xiàn)手機(jī)自動(dòng)撥打電話的方法(通話壓力測試),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python解釋器+Shell腳本實(shí)現(xiàn)桌面打開軟件過程
本文介紹了在Ubuntu系統(tǒng)上創(chuàng)建一個(gè)模擬Windows可執(zhí)行文件(.exe)的腳本(.sh),并通過桌面快捷方式實(shí)現(xiàn)一鍵啟動(dòng),整個(gè)過程包括創(chuàng)建腳本、賦予執(zhí)行權(quán)限、創(chuàng)建桌面快捷方式以及運(yùn)行驗(yàn)證2025-12-12
Python開發(fā)文字版密室逃脫游戲的實(shí)例(含代碼)
密室逃脫游戲是一種頗受歡迎的解謎類游戲,玩家通常需要通過觀察、推理、合作等方式解決一系列難題,以逃脫困境,在這篇博文中,我們將使用Python開發(fā)一個(gè)文字版密室逃脫游戲,旨在通過簡單的文本交互來呈現(xiàn)游戲的趣味性與挑戰(zhàn)性2025-04-04
Python+Selenium瀏覽器自動(dòng)化測試與網(wǎng)頁自動(dòng)登錄
在日常開發(fā)、測試和辦公自動(dòng)化中,我們經(jīng)常會(huì)遇到一些重復(fù)性的瀏覽器操作,如果這些操作每天都要重復(fù)執(zhí)行,手動(dòng)處理不僅浪費(fèi)時(shí)間,還容易因?yàn)槁c(diǎn)、輸錯(cuò)、忘記截圖而出錯(cuò),本文面向Python自動(dòng)化測試初學(xué)者,通過一個(gè)完整案例講解如何使用Selenium自動(dòng)打開網(wǎng)頁2026-05-05
Python并發(fā)之多進(jìn)程的方法實(shí)例代碼
這篇文章主要介紹了Python并發(fā)之多進(jìn)程的方法實(shí)例代碼,文中也提到了進(jìn)程與線程的共同點(diǎn),需要的朋友跟隨腳本之家小編一起看看吧2018-08-08
python 連接各類主流數(shù)據(jù)庫的實(shí)例代碼
下面小編就為大家分享一篇python 連接各類主流數(shù)據(jù)庫的實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Pyhthon中使用compileall模塊編譯源文件為pyc文件
這篇文章主要介紹了Pyhthon中使用compileall模塊編譯源文件為pyc文件,需要的朋友可以參考下2015-04-04
python編寫函數(shù)注意事項(xiàng)總結(jié)
在本篇文章里小編給大家分享了一篇關(guān)于python編寫函數(shù)注意事項(xiàng)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2021-03-03
python實(shí)現(xiàn)視頻抽幀與添加背景音頻和字幕朗讀的腳本分享
這篇文章主要為大家詳細(xì)介紹了如何使用python實(shí)現(xiàn)視頻抽幀、添加srt字幕朗讀、添加背景音頻等功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11

