Python中使用正則表達(dá)式替換特定格式的文本
在Python中使用正則表達(dá)式替換特定格式的文本,主要通過re模塊的sub()和subn()函數(shù)實(shí)現(xiàn)。這兩個(gè)函數(shù)可以根據(jù)正則表達(dá)式模式查找匹配內(nèi)容,并替換為指定的字符串或通過函數(shù)生成的內(nèi)容。
一、核心函數(shù)
re.sub(pattern, repl, string, count=0, flags=0)- 功能:替換字符串中所有匹配
pattern的子串為repl - 返回值:替換后的新字符串
- 參數(shù):
pattern:正則表達(dá)式模式repl:替換的字符串或回調(diào)函數(shù)string:原始字符串count:最大替換次數(shù)(默認(rèn)0表示全部限制)flags:正則匹配標(biāo)志(如re.IGNORECASE忽略大小寫)
- 功能:替換字符串中所有匹配
re.subn(pattern, repl, string, count=0, flags=0)- 功能:與
sub()類似,但返回(新字符串, 替換次數(shù))的元組
- 功能:與
二、常用替換場(chǎng)景示例
1. 基礎(chǔ)替換:固定字符串替換
將匹配的文本替換為固定內(nèi)容。
import re # 將所有數(shù)字替換為"*" text = "密碼: 123456, 驗(yàn)證碼: 789" result = re.sub(r"\d+", "*", text) print(result) # 輸出: 密碼: *, 驗(yàn)證碼: * # 限制替換次數(shù)(只替換前1個(gè)) result = re.sub(r"\d+", "*", text, count=1) print(result) # 輸出: 密碼: *, 驗(yàn)證碼: 789
2. 分組替換:利用匹配的分組內(nèi)容
通過()捕獲分組,在替換字符串中用\1、\2等引用分組內(nèi)容(類似變量復(fù)用)。
import re
# 交換姓名格式:" lastName, firstName" → "firstName lastName"
text = "Bond, James; Doe, John"
pattern = r"(\w+), (\w+)" # 分組1:姓氏,分組2:名字
result = re.sub(pattern, r"\2 \1", text) # 用\2和\1交換順序
print(result) # 輸出: James Bond; John Doe
# 格式化日期:"MM/DD/YYYY" → "YYYY-MM-DD"
text = "今天是10/05/2023,昨天是10/04/2023"
pattern = r"(\d{2})/(\d{2})/(\d{4})" # 分組1:月,分組2:日,分組3:年
result = re.sub(pattern, r"\3-\1-\2", text)
print(result) # 輸出: 今天是2023-10-05,昨天是2023-10-043. 函數(shù)替換:動(dòng)態(tài)生成替換內(nèi)容
當(dāng)替換規(guī)則復(fù)雜時(shí),repl可以是一個(gè)函數(shù),根據(jù)匹配結(jié)果動(dòng)態(tài)生成替換內(nèi)容。
import re
# 將數(shù)字乘以2(如"3"→"6","10"→"20")
def double_num(match):
num = int(match.group()) # 獲取匹配的數(shù)字
return str(num * 2)
text = "單價(jià): 5, 數(shù)量: 3, 總價(jià): 15"
result = re.sub(r"\d+", double_num, text)
print(result) # 輸出: 單價(jià): 10, 數(shù)量: 6, 總價(jià): 30
# 敏感信息脫敏:保留手機(jī)號(hào)前3位和后4位,中間用*代替
def mask_phone(match):
phone = match.group()
return phone[:3] + "****" + phone[-4:]
text = "聯(lián)系電話: 13812345678, 備用電話: 19987654321"
result = re.sub(r"1[3-9]\d{9}", mask_phone, text)
print(result) # 輸出: 聯(lián)系電話: 138****5678, 備用電話: 199****43214. 忽略大小寫替換
通過flags=re.IGNORECASE(簡(jiǎn)寫re.I)忽略大小寫匹配。
import re # 將"apple"(不區(qū)分大小寫)替換為"banana" text = "Apple, APPLE, apple" result = re.sub(r"apple", "banana", text, flags=re.IGNORECASE) print(result) # 輸出: banana, banana, banana
5. 移除特定格式內(nèi)容
將匹配的內(nèi)容替換為空字符串,實(shí)現(xiàn)"刪除"效果。
import re # 移除HTML標(biāo)簽(如<a>、<div>等) html = "<h1>標(biāo)題</h1><p>內(nèi)容</p>" result = re.sub(r"<.*?>", "", html) # 匹配所有標(biāo)簽并替換為空 print(result) # 輸出: 標(biāo)題內(nèi)容 # 移除字符串中的所有標(biāo)點(diǎn)符號(hào) text = "Hello, World! 這是一個(gè)示例:test." result = re.sub(r"[^\w\s]", "", text) # [^\w\s]匹配非單詞和非空白字符 print(result) # 輸出: Hello World 這是一個(gè)示例 test
三、關(guān)鍵技巧
- 使用
r前綴:替換字符串建議加r前綴(原始字符串),避免\被轉(zhuǎn)義(如r"\2"正確引用分組2)。 - 貪婪與非貪婪匹配:替換時(shí)注意模式的匹配范圍,必要時(shí)用
?啟用非貪婪模式(如.*?匹配盡可能少的字符)。 - 預(yù)編譯模式:頻繁替換時(shí),用
re.compile()編譯模式提升效率:pattern = re.compile(r"\d+") result = pattern.sub("*", "A1B2C3") # 輸出: "A*B*C*"
通過sub()和subn(),可以靈活處理各種替換需求,從簡(jiǎn)單的固定替換到復(fù)雜的動(dòng)態(tài)生成替換內(nèi)容,正則表達(dá)式都能高效完成。
到此這篇關(guān)于Python中使用正則表達(dá)式替換特定格式的文本的文章就介紹到這了,更多相關(guān)python正則表達(dá)式替換文本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
講解Python中for循環(huán)下的索引變量的作用域
這篇文章主要介紹了講解Python中for循環(huán)下的索引變量的作用域,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),本文給出了Python3的示例幫助讀者理解,需要的朋友可以參考下2015-04-04
Pandas高級(jí)教程之Pandas中的GroupBy操作
通常來說groupby操作可以分為三部分:分割數(shù)據(jù),應(yīng)用變換和和合并數(shù)據(jù),本文將會(huì)詳細(xì)講解Pandas中的groupby操作,感興趣的朋友一起看看吧2021-07-07
使用pyinstaller打包PySide2程序中遇到的問題
說到打包,我們就需要用到python程序的打包工具pyinstaller了,這個(gè)包安裝簡(jiǎn)單,使用同樣簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于使用pyinstaller打包PySide2程序中遇到的問題,需要的朋友可以參考下2023-05-05
使用CodeMirror實(shí)現(xiàn)Python3在線編輯器的示例代碼
這篇文章主要介紹了使用CodeMirror實(shí)現(xiàn)Python3在線編輯器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01

