sub 與 split
sub 依模式改字,split 依模式切開。兩者都接受字串或函式當「怎麼替換/怎麼切」。
re.sub:取代
import re
print(re.sub(r"\s+", " ", "太多 空白\n擠在一起"))
# '太多 空白 擠在一起'
print(re.sub(r"\d", "#", "A12-B9", count=2))
# 'A##-B9' 只改前兩處
count=0(預設)表示全部改。re.subn 多回傳改了幾次:(新字串, 次數)。
取代字串裡可用回溯:\1、\g<1>、\g<name>。數字緊接在後面時一定要用 \g<1>:
import re
print(re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\3/\2/\1", "2026-09-15"))
print(re.sub(r"(?P<y>\d{4})-(?P<m>\d{2})-(?P<d>\d{2})", r"\g<d>/\g<m>/\g<y>", "2026-09-15"))
用函式決定取代內容
第二個參數可以是函式,收到 Match,回傳要寫回去的字串:
import re
def to_twd(m: re.Match) -> str:
ntd = int(m.group("usd")) * 32
return f"TWD {ntd}"
print(re.sub(r"USD (?P<usd>\d+)", to_twd, "USD 10 與 USD 3"))
# TWD 320 與 TWD 96
適合大小寫轉換、查表、算數字。匯率這裡只是示範,真實系統不要寫死在 regex 回呼裡。
re.split:切開
import re
print(re.split(r"[,;]\s*", "a, b;c, d"))
# ['a', 'b', 'c', 'd']
print(re.split(r"(\d+)", "第12頁共30頁"))
# ['第', '12', '頁共', '30', '頁']
模式裡有捕獲群組時,分隔符自己也會留在結果裡。這在「既要切、又要保留數字」時很好用。
maxsplit 限制切幾刀:
連續分隔符可能產生空字串。切完後常會 filter(None, ...) 或在模式裡避免可選到零寬。