正则表达式——转义

前面讲解了匹配优先量词和忽略优先量词,现在介绍量词的转义 。

在正则表达式中,*+?等作为量词的字符具有特殊意义,但有些情况下只希望表示这些字符本身,此时就必须使用转义,也就是在它们之前添加反斜线\

对常用量词所使用的字符+*?来说,如果希望表示这三个字符本身,直接添加反斜线,变为\+\*\?即可。但是在一般形式的量词{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  
posted @ 2018-10-20 11:16  gaara724  阅读(7608)  评论(0编辑  收藏  举报