
在 python 3.12 版, 直接使用 re.compile(“[\d]”) 會顯示警告:
SyntaxWarning: invalid escape sequence '\d'
警告發生的原因
這個警告是因為您在定義正規表達式(Regular Expression, Regex)模式時,使用了標準字串(Standard String)來包含 \d。
- Python 字串處理器(String Processor):
- 當 Python 看到一個標準字串(例如
'[\d]'或"[\d]") 時,它會先嘗試解釋字串中的反斜線跳脫序列(Escape Sequences)。 - 例如,
\n會被轉義成換行符號,\t會被轉義成 Tab 符號,而\\會被轉義成單個反斜線。 - 但是,
\d不是 Python 標準字串中的一個已知的跳脫序列。因此,Python 雖然知道您的意圖可能是用於正規表達式,但它仍會發出一個SyntaxWarning來提醒您,這可能不是一個安全的寫法,並將\d解釋為兩個字元:反斜線 (\) 和 字母 d (d)。
- 當 Python 看到一個標準字串(例如
- 正規表達式引擎(Regex Engine):
- 雖然 Python 報了警告,但當字串被傳遞給
re.compile()函式時,正規表達式引擎會接手處理。 - 對於正規表達式引擎來說,
\d是一個有效的特殊序列,表示匹配任何數字(digit)。 - 因此,您的程式碼雖然有警告,但仍然能正常工作,因為正規表達式引擎正確地解釋了模式。
- 雖然 Python 報了警告,但當字串被傳遞給
解決方案(推薦做法)
為了解決這個警告並採用更規範的寫法,您應該使用 原始字串(Raw String) 來定義正規表達式模式。
原始字串是在開頭的引號前加上一個 r。在原始字串中,反斜線 (\) 會被視為一個普通字元,Python 字串處理器不會對它進行任何特殊解釋,從而避免了警告。
Python
import re
# 使用 r"..." 定義原始字串
pattern = re.compile(r"[\d]")
✍️ 額外提示
- 在正規表達式中,
[\d]和\d的效果是一樣的,都表示匹配一個數字。通常我們會直接使用更簡潔的\d:pattern = re.compile(r"\d") - 如果您堅持使用標準字串,您必須對反斜線進行兩次跳脫,讓它成為字面上的兩個反斜線,才能傳遞一個
\d給正規表達式引擎。但這非常不建議,因為閱讀性極差:pattern = re.compile("[\\d]")
結論:請務必使用原始字串 r"..." 來撰寫正規表達式模式。