前面講解了匹配優先量詞和忽略優先量詞,現在介紹量詞的轉義 。
在正則表達式中,*、+、?等作為量詞的字符具有特殊意義,但有些情況下只希望表示這些字符本身,此時就必須使用轉義,也就是在它們之前添加反斜線\。
對常用量詞所使用的字符+、*、?來說,如果希望表示這三個字符本身,直接添加反斜線,變為\+、\*、\?即可。但是在一般形式的量詞{m,n}中,雖然具有特殊含義的字符不止一個,轉義時卻只需要給第一個{添加反斜線即可,也就是說,如果希望匹配字符串{m,n},正則表達式必須寫成\{m,n}。
另外值得一提的是忽略優先量詞的轉義,雖然忽略優先量詞也包含不只一個字符,但是在轉義時卻不像一般形式的量詞那樣,只轉義第一個字符即可,而需要將兩個量詞全部轉義。舉例來說,如果要匹配字符串*?,正則表達式就必須寫作\*\?,而不是\*?,因為后者的意思是"*這個字符可能出現,也可能不出現"。
表2-5列出了常用量詞的轉義形式。
量詞 |
轉義形式 |
{n} |
\{n} |
{m,n} |
\{m,n} |
{m,} |
\{m,} |
{,n} |
\{,n} |
* |
\* |
+ |
\+ |
? |
\? |
*? |
\*\? |
+? |
\+\? |
?? |
\?\? |
之前還介紹了點號.,所以還必須講解點號的轉義:點號.是一個元字符,它可以匹配除換行符之外的任何字符,所以如果只想匹配點號本身,必須將它轉義為\.。
因為未轉義的點號可以匹配任何字符,其中也可以包含點號,所以經常有人忽略了對點號的轉義。如果真的這樣做了,在確實需要嚴格匹配點號時就可能出錯,比如匹配小數(如3.14)、IP地址(如192.168.1.1)、E-mail地址(如someone@somehost.com)。所以,如果要匹配的文本包含點號,一定不要忘記轉義正則表達式中的點號,否則就有可能出現例2-19那樣的錯誤。
例2-19 忽略轉義點號可能導致錯誤
#錯誤判斷浮點數 print re.search(r"^\d+.\d+$", "3.14") != None # => True print re.search(r"^\d+.\d+$", "3a14") != None # => True #准確判斷浮點數 print re.search(r"^\d+\.\d+$", "3.14") != None # => True print re.search(r"^\d+\.\d+$", "3a14") != None # => False