正则表达式——转义
前面讲解了匹配优先量词和忽略优先量词,现在介绍量词的转义 。
在正则表达式中,*、+、?等作为量词的字符具有特殊意义,但有些情况下只希望表示这些字符本身,此时就必须使用转义,也就是在它们之前添加反斜线\。
对常用量词所使用的字符+、*、?来说,如果希望表示这三个字符本身,直接添加反斜线,变为\+、\*、\?即可。但是在一般形式的量词{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