Python中使用正則表達式替換特定格式的文本
在Python中使用正則表達式替換特定格式的文本,主要通過re
模塊的sub()
和subn()
函數(shù)實現(xiàn)。這兩個函數(shù)可以根據(jù)正則表達式模式查找匹配內(nèi)容,并替換為指定的字符串或通過函數(shù)生成的內(nèi)容。
一、核心函數(shù)
re.sub(pattern, repl, string, count=0, flags=0)
- 功能:替換字符串中所有匹配
pattern
的子串為repl
- 返回值:替換后的新字符串
- 參數(shù):
pattern
:正則表達式模式repl
:替換的字符串或回調(diào)函數(shù)string
:原始字符串count
:最大替換次數(shù)(默認0表示全部限制)flags
:正則匹配標志(如re.IGNORECASE
忽略大小寫)
- 功能:替換字符串中所有匹配
re.subn(pattern, repl, string, count=0, flags=0)
- 功能:與
sub()
類似,但返回(新字符串, 替換次數(shù))
的元組
- 功能:與
二、常用替換場景示例
1. 基礎(chǔ)替換:固定字符串替換
將匹配的文本替換為固定內(nèi)容。
import re # 將所有數(shù)字替換為"*" text = "密碼: 123456, 驗證碼: 789" result = re.sub(r"\d+", "*", text) print(result) # 輸出: 密碼: *, 驗證碼: * # 限制替換次數(shù)(只替換前1個) result = re.sub(r"\d+", "*", text, count=1) print(result) # 輸出: 密碼: *, 驗證碼: 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-04
3. 函數(shù)替換:動態(tài)生成替換內(nèi)容
當(dāng)替換規(guī)則復(fù)雜時,repl
可以是一個函數(shù),根據(jù)匹配結(jié)果動態(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 = "單價: 5, 數(shù)量: 3, 總價: 15" result = re.sub(r"\d+", double_num, text) print(result) # 輸出: 單價: 10, 數(shù)量: 6, 總價: 30 # 敏感信息脫敏:保留手機號前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****4321
4. 忽略大小寫替換
通過flags=re.IGNORECASE
(簡寫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)容替換為空字符串,實現(xiàn)"刪除"效果。
import re # 移除HTML標簽(如<a>、<div>等) html = "<h1>標題</h1><p>內(nèi)容</p>" result = re.sub(r"<.*?>", "", html) # 匹配所有標簽并替換為空 print(result) # 輸出: 標題內(nèi)容 # 移除字符串中的所有標點符號 text = "Hello, World! 這是一個示例:test." result = re.sub(r"[^\w\s]", "", text) # [^\w\s]匹配非單詞和非空白字符 print(result) # 輸出: Hello World 這是一個示例 test
三、關(guān)鍵技巧
- 使用
r
前綴:替換字符串建議加r
前綴(原始字符串),避免\
被轉(zhuǎn)義(如r"\2"
正確引用分組2)。 - 貪婪與非貪婪匹配:替換時注意模式的匹配范圍,必要時用
?
啟用非貪婪模式(如.*?
匹配盡可能少的字符)。 - 預(yù)編譯模式:頻繁替換時,用
re.compile()
編譯模式提升效率:pattern = re.compile(r"\d+") result = pattern.sub("*", "A1B2C3") # 輸出: "A*B*C*"
通過sub()
和subn()
,可以靈活處理各種替換需求,從簡單的固定替換到復(fù)雜的動態(tài)生成替換內(nèi)容,正則表達式都能高效完成。
到此這篇關(guān)于Python中使用正則表達式替換特定格式的文本的文章就介紹到這了,更多相關(guān)python正則表達式替換文本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
講解Python中for循環(huán)下的索引變量的作用域
這篇文章主要介紹了講解Python中for循環(huán)下的索引變量的作用域,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,本文給出了Python3的示例幫助讀者理解,需要的朋友可以參考下2015-04-04使用pyinstaller打包PySide2程序中遇到的問題
說到打包,我們就需要用到python程序的打包工具pyinstaller了,這個包安裝簡單,使用同樣簡單,下面這篇文章主要給大家介紹了關(guān)于使用pyinstaller打包PySide2程序中遇到的問題,需要的朋友可以參考下2023-05-05使用CodeMirror實現(xiàn)Python3在線編輯器的示例代碼
這篇文章主要介紹了使用CodeMirror實現(xiàn)Python3在線編輯器的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01