錨點與邊界
錨點不消耗字元,只檢查「目前掃到的位置」合不合條件。少了它們,模式常會在字串中間誤中。
^ 與 $
預設:
^:整個字串的開頭$:整個字串的結尾(字串末若有一個換行,$仍可對在換行前)
import re
print(bool(re.search(r"^\d+$", "2026"))) # True,整串都是數字
print(bool(re.search(r"^\d+$", "A2026"))) # False
print(bool(re.search(r"\d+", "A2026"))) # True,只要求「有一段數字」
驗證「整份輸入合格式」時,用 ^...$,或改用 re.fullmatch(見 search / match)。
加上 re.MULTILINE(re.M)後,^ $ 會對每一行的行首/行尾:
import re
log = "ERROR disk full\nINFO started\nERROR timeout"
print(re.findall(r"^ERROR.*", log, flags=re.M))
# ['ERROR disk full', 'ERROR timeout']
\A 與 \Z
\A 永遠是字串開頭,\Z 永遠是字串結尾,不受 re.M 影響。寫「整份檔案只能這樣」時比 ^ $ 更不容易被旗標改掉。
單字邊界 \b
\b 在「\w 與 \W 交界」的位置(含字串兩端)。\B 則是「不是邊界」。
import re
text = "cat scatter category cat."
print(re.findall(r"\bcat\b", text)) # ['cat', 'cat']
print(re.findall(r"cat", text)) # 連 scatter、category 裡的 cat 也中
Python 的 \w 含 Unicode 字母,所以中文詞的「邊界」跟英文不一樣。對中文關鍵字搜尋,\b 常常不如你想的那樣好用;改用明確前後文或乾脆 in。
相關資料
- 上一頁:量詞
- 下一頁:群組與回溯
- 旗標細節:compile 與旗標