接下来学习正则表达式的边界表示,边界表示就是在写正则表达式的时候,限制匹配的字符串的开始和结束边界。
字符 描述
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界
注意:边界字符只用于描述边界信息,不能用于字符的匹配。
示例:完善之前课时中关于手机号码匹配的示例,在匹配超过11位的手机号,或者11位的手机号后边还有其他字符的情况,正则表达式也能够匹配成功,这种情况是不允许的。这种情况就需要限制手机号的结尾。
#使用$限制匹配的字符串以11位数字组成,结尾不能添加其他字符
rs = re.match("1[3578]\d{9}$","13612345678")
print(rs.group()) #匹配正确的手机号
#手机号末尾添加字符串将匹配失败
rs = re.match("1[3578]\d{9}$","13612345678abc")#匹配失败
print(type(rs)) #空类型
运行结果:
13612345678
<class ‘NoneType’>
(使用match方法进行正则匹配“^”匹配开头不是很明显,因为match本身就是从左向右顺序匹配的)
示例:邮箱匹配
#邮箱地址以3到10个单词字符开始,以@163.com结束
rs = re.match("\w{3,10}@163.com$","hello_123@163.com")
print(rs)
rs = re.match("\w{3,10}@163.com$","he@163.com")
print(rs)
rs = re.match("\w{3,10}@163.com$","hello_12345645@163.com")
print(rs)
rs = re.match("\w{3,10}@163.com$","hello_123@163.comhaha")
print(rs)
运行结果:
<_sre.SRE_Match object; span=(0, 17), match=‘hello_123@163.com’>
None
None
None
问题1:随意用一个字母代替邮箱中的“.”也会匹配成功
rs = re.match("\w{3,10}@163.com$","hello_123@163hcom")
print("匹配结果:%s"%rs)
运行结果:
匹配结果:<_sre.SRE_Match object; span=(0, 17), match=‘hello_123@163hcom’>
原因是:在正则表达式中“.”有特殊的含义,表示除\n之外的任意字符
解决办法:使用转义字符\ 标识“.”是普通字符“.”
rs = re.match("\w{3,10}@163\.com$","hello_123@163.com")
print("匹配结果1:%s"%rs)
rs = re.match("\w{3,10}@163\.com$","hello_123@163hcom")
print("匹配结果2:%s"%rs)
运行结果:
匹配结果1:<_sre.SRE_Match object; span=(0, 17), match=‘hello_123@163.com’>
匹配结果2:None