Python 中看到的 SyntaxWarning: invalid escape sequence ‘\d’ 警告

在 python 3.12 版, 直接使用 re.compile(“[\d]”) 會顯示警告:

SyntaxWarning: invalid escape sequence '\d'

警告發生的原因

這個警告是因為您在定義正規表達式(Regular Expression, Regex)模式時,使用了標準字串(Standard String)來包含 \d

  1. Python 字串處理器(String Processor):
    • 當 Python 看到一個標準字串(例如 '[\d]'"[\d]") 時,它會先嘗試解釋字串中的反斜線跳脫序列(Escape Sequences)
    • 例如,\n 會被轉義成換行符號,\t 會被轉義成 Tab 符號,而 \\ 會被轉義成單個反斜線。
    • 但是,\d 不是 Python 標準字串中的一個已知的跳脫序列。因此,Python 雖然知道您的意圖可能是用於正規表達式,但它仍會發出一個 SyntaxWarning 來提醒您,這可能不是一個安全的寫法,並將 \d 解釋為兩個字元:反斜線 (\) 和 字母 d (d)。
  2. 正規表達式引擎(Regex Engine):
    • 雖然 Python 報了警告,但當字串被傳遞給 re.compile() 函式時,正規表達式引擎會接手處理。
    • 對於正規表達式引擎來說,\d 是一個有效的特殊序列,表示匹配任何數字(digit)
    • 因此,您的程式碼雖然有警告,但仍然能正常工作,因為正規表達式引擎正確地解釋了模式。

解決方案(推薦做法)

為了解決這個警告並採用更規範的寫法,您應該使用 原始字串(Raw String) 來定義正規表達式模式。

原始字串是在開頭的引號前加上一個 r。在原始字串中,反斜線 (\) 會被視為一個普通字元,Python 字串處理器不會對它進行任何特殊解釋,從而避免了警告。

Python

import re
# 使用 r"..." 定義原始字串
pattern = re.compile(r"[\d]") 

✍️ 額外提示

  1. 在正規表達式中,[\d]\d 的效果是一樣的,都表示匹配一個數字。通常我們會直接使用更簡潔的 \d
    pattern = re.compile(r"\d")
  2. 如果您堅持使用標準字串,您必須對反斜線進行兩次跳脫,讓它成為字面上的兩個反斜線,才能傳遞一個 \d 給正規表達式引擎。但這非常不建議,因為閱讀性極差:
    pattern = re.compile("[\\d]")

結論:請務必使用原始字串 r"..." 來撰寫正規表達式模式。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *