正则表达式——转义
前⾯讲解了匹配优先量词和忽略优先量词,现在介绍量词的转义。
在正则表达式中,*、+、?等作为量词的字符具有特殊意义,但有些情况下只希望表⽰这些字符本⾝,此时就必须使⽤转义,也就是在它们之前添加反斜线\。
对常⽤量词所使⽤的字符+、*、?来说,如果希望表⽰这三个字符本⾝,直接添加反斜线,变为\+、\*、\?即可。但是在⼀般形式的量
词{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)。所以,如果要匹配的⽂本包含点号,⼀定不要忘记转义正则表达式中的点号,否则就有可能出现例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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。