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)))整串驗證
你的練習清單
- 模式使用原始字串。
- search 回傳 None 時不要呼叫 group()。
- 先在小輸入上測試模式。
- 優先使用清楚的字元類,而不是炫技的複雜模式。
常見問題
為什麼正規模式要用 r"..."?
原始字串保留反斜槓,讓正規引擎收到你原本想寫的模式。
search 和 findall 有什麼區別?
search 回傳第一個比對物件或 None;findall 回傳所有比對字串組成的列表。
什麼時候不該用正規?
split、replace、startswith 等簡單字串方法已經能清楚表達規則時,就不需要正規。正規適合真正基於模式的文字。
練習正規表達式
12 道題,覆蓋 search、findall、sub、字元類和原始字串。
繼續閱讀: