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"))
編譯後的物件有 search、match、fullmatch、findall、finditer、sub、split。模組層的 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))
相關資料
- 上一頁:sub 與 split
- 錨點與
re.M:錨點 - 官方:Module Contents