在早期規定中,正則表達式用反斜槓字符 ("\") 來表示特殊格式或容許使用特殊字符而不調用它的特殊用法。這就與 Python 在字符串中的那些起相同做用的相同字符產生了衝突。正則表達式
讓咱們舉例說明,你想寫一個 RE 以匹配字符串 "\section",多是在一個 LATEX 文件查找。爲了要在程序代碼中判斷,首先要寫出想要匹配的字符串。接下來你須要在全部反斜槓和其它元字符前加反斜槓來取消其特殊意義,結果要匹配的字符串就成了"\section"。 當把這個字符串傳遞給re.compile()時必須仍是"\section"。然而,做爲Python的字符串實值(string literals)來表示的話,"\section"中兩個反斜槓還要再次取消特殊意義,最後結果就變成了"\\section"。字符串
字符 | 階段 |
---|---|
\section | 要匹配的字符串 |
\section | 爲 re.compile 取消反斜槓的特殊意義 |
"\\section" | 爲"\section"的字符串實值(string literals)取消反斜槓的特殊意義 |
簡單地說,爲了匹配一個反斜槓,不得不在 RE 字符串中寫 '\\',由於正則表達式中必須是 "\",而每一個反斜槓在常規的 Python 字符串實值中必須表示成 "\"。在 REs 中反斜槓的這個重複特性會致使大量重複的反斜槓,並且所生成的字符串也很難懂。string
解決的辦法就是爲正則表達式使用 Python 的 raw 字符串表示;在字符串前加個 "r" 反斜槓就不會被任何特殊方式處理,因此 r"\n" 就是包含"\" 和 "n" 的兩個字符,而 "\n" 則是一個字符,表示一個換行。正則表達式一般在 Python 代碼中都是用這種 raw 字符串表示。it
常規字符串 | Raw 字符串 |
---|---|
"ab*" | r"ab*" |
"\\section" | r"\section" |
"\w+\s+\1" | r"\w+\s+\1" |