正則表達式——轉義


前面講解了匹配優先量詞和忽略優先量詞,現在介紹量詞的轉義 。

在正則表達式中,*+?等作為量詞的字符具有特殊意義,但有些情況下只希望表示這些字符本身,此時就必須使用轉義,也就是在它們之前添加反斜線\

對常用量詞所使用的字符+*?來說,如果希望表示這三個字符本身,直接添加反斜線,變為\+\*\?即可。但是在一般形式的量詞{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  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM