批次取代
re.sub 適合「整份文字照規則改」。改完仍是字串,不會幫你驗證語意。
把各種空白收成單一空白
import re
messy = "標題\t\t內容\n\n下一行 還有空格"
print(re.sub(r"[ \t]+", " ", messy))
print(re.sub(r"\n{3,}", "\n\n", messy)) # 連續空行最多留一個
日期改格式
import re
text = "截止 2026-09-15,補件 2026-10-01。"
print(re.sub(
r"(?P<y>\d{4})-(?P<m>\d{2})-(?P<d>\d{2})",
r"\g<d>/\g<m>/\g<y>",
text,
))
# 截止 15/09/2026,補件 01/10/2026。
遮罩信用卡中間碼
import re
def mask_card(m: re.Match) -> str:
digits = re.sub(r"\D", "", m.group(0))
return digits[:4] + "*" * (len(digits) - 8) + digits[-4:]
raw = "卡號 1234-5678-9012-3456 請勿外流"
print(re.sub(r"\d{4}(?:[-\s]?\d{4}){3}", mask_card, raw))
# 卡號 1234********3456 請勿外流
示範用。真正處理付款資料要走 PCI 規範,不要自己用 regex 存卡號。
把 Markdown 粗體標籤拿掉
import re
md = "這是 **重要** 與 **也很重要** 的句子。"
print(re.sub(r"\*\*(.+?)\*\*", r"\1", md))
# 這是 重要 與 也很重要 的句子。
懶惰量詞 .+? 避免一次吃到最後一個 **。巢狀粗體仍會壞掉;完整 Markdown 請用剖析器。
敏感詞換成相同長度的星號
import re
def stars(m: re.Match) -> str:
return "*" * len(m.group(0))
policy = re.compile(r"密碼|口令", re.IGNORECASE)
print(policy.sub(stars, "請勿把密碼寫在聊天室"))
中文沒有大小寫,re.I 對它們沒差別;對英文關鍵字才有用。
相關資料
- API:sub 與 split
- 下一頁:日誌與多行文字