專項練習 · 9 分鐘閱讀

Python 正規練習:尋找、提取與替換

正規表達式是一種描述文字模式的緊湊語言。先寫一個清楚的模式,在小字串上測試,再添加分組或量詞。

使用原始字串

正規模式寫成原始字串,例如 r"\d+"。r 前綴會阻止 Python 提前解釋反斜槓,讓正規引擎收到原本的模式。這樣可以避免一類常見的困惑。

import re
print(re.findall(r"\d+", "a1 b22 c333"))

用原始字串比對數字

尋找一個比對

re.search 回傳第一次出現的比對物件;沒有比對時回傳 None。用 group() 讀取文字。輸入來自使用者或檔案時,尤其要先判斷 None。

import re
match = re.search(r"\d+", "Order 42")
if match:
    print(match.group())

先判斷再讀取

找出所有比對

re.findall 回傳所有不重疊比對組成的列表。字元類讓一個模式比對一組字元:[A-Z] 尋找大寫字母。字元類可以配合量詞描述重複。

import re
print(re.findall(r"[A-Z]", "pyTHON"))
print(re.findall(r"\d+", "a1 b22"))

收集所有比對

替換文字

re.sub 會把每個比對替換成指定字串。\s+ 這樣的模式比對連續空白。先在小樣本上測試替換,再應用到整份文件。

import re
text = "latte   tea  mocha"
print(re.sub(r"\s+", " ", text))

規範化空格

驗證簡單的形狀

re.fullmatch 檢查整個字串是否比對模式。這裡的 \d{3}-\d{4} 表示三個數字、一個連字元、四個數字。呼叫者只關心是否有效時,回傳布林值即可。

import re
phone = "555-1234"
print(bool(re.fullmatch(r"\d{3}-\d{4}", phone)))

整串驗證

你的練習清單

常見問題

為什麼正規模式要用 r"..."?

原始字串保留反斜槓,讓正規引擎收到你原本想寫的模式。

search 和 findall 有什麼區別?

search 回傳第一個比對物件或 None;findall 回傳所有比對字串組成的列表。

什麼時候不該用正規?

split、replace、startswith 等簡單字串方法已經能清楚表達規則時,就不需要正規。正規適合真正基於模式的文字。

練習正規表達式

12 道題,覆蓋 search、findall、sub、字元類和原始字串。

打開練習

繼續閱讀: