Skip to content

建立 2026-09-15 更新 2026-09-15

compile 與旗標

同一個模式要對很多字串跑時,先 re.compile,再呼叫方法。旗標用來改引擎的預設規則。

compile

import re

email = re.compile(
    r"^[\w.+-]+@[\w-]+(\.[\w-]+)+$",
    flags=re.IGNORECASE,
)

print(email.fullmatch("Ada@vcdemy.com"))
print(email.fullmatch("not-an-email"))

編譯後的物件有 searchmatchfullmatchfindallfinditersubsplit。模組層的 re.search(pattern, ...) 內部也會快取編譯結果,偶爾用幾次不必強迫 compile;迴圈裡或匯出成模組常數時,編譯過比較清楚。

常用旗標

旗標 縮寫 作用
re.IGNORECASE re.I 大小寫視為相同
re.MULTILINE re.M ^ $ 對每一行
re.DOTALL re.S . 連換行也匹配
re.VERBOSE re.X 模式裡空白與 # 註解被忽略
re.ASCII re.A \d \w \s 只認 ASCII

可以位元 OR 組合:re.I | re.M。也可以寫進模式開頭 (?im)

import re

log = "Error: disk\nerror: timeout"
print(re.findall(r"^error:.*", log, flags=re.I | re.M))
# ['Error: disk', 'error: timeout']

VERBOSE:複雜模式拆行

長模式用 re.X 才讀得下去。空白不再是「真的空白」,真的空白要寫 \[ ]

import re

tw_mobile = re.compile(r"""
    ^
    (?:09)          # 台灣手機開頭
    \d{2}
    -?
    \d{3}
    -?
    \d{3}
    $
""", re.VERBOSE)

print(bool(tw_mobile.fullmatch("0912-345-678")))
print(bool(tw_mobile.fullmatch("0912345678")))

ASCII 與 Unicode

預設 \w 含「你好」這類字母,\d 也可能匹配非阿拉伯數字的數字字元。若你要的是 [0-9][A-Za-z0-9_],寫清楚集合,或加 re.ASCII

import re

print(re.findall(r"\w+", "ID_42 編號"))
print(re.findall(r"\w+", "ID_42 編號", flags=re.ASCII))

相關資料