|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
刚学完小甲鱼第一节正则表达式的视频(第57讲),关于ip地址相关的正则表达式,小甲鱼在视频最后给出的方法在视频中提示还有一个小bug,试了一下,果然是有个bug
- >>> import re
- >>> re.search(r'[01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5]', '206')
- <re.Match object; span=(0, 2), match='20'>
- >>> re.search(r'[01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5]', '253')
- <re.Match object; span=(0, 2), match='25'>
- >>> re.search(r'[01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5]', '237')
- <re.Match object; span=(0, 2), match='23'>
- >>> re.search(r'2[0-4]\d', '206')
- <re.Match object; span=(0, 3), match='206'>
- >>> re.search(r'2[0-4]\d', '237')
- <re.Match object; span=(0, 3), match='237'>
- >>> re.search(r'25[0-5]', '253')
- <re.Match object; span=(0, 3), match='253'>
复制代码
如上所示,针对IP地址中四个0-255的数字,视频中小甲鱼最后给出的正则表达式为[01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5],这个表达式在数字超过200之后就只能匹配上前两位了,而单独使用2[0-4]\d和25[0-5]匹配超过200之后的数字又是可以的,这里的bug出在什么地方呢?实在是看不出来问题在什么地方,求大神解答啊
{0,1}匹配0次或1次。这样就很明显了,因为匹配0-199的表达式排在最前面所以先执行的是r'[01]{0,1}\d{0,1}\d‘,匹配超过200的数时,比如'205‘时,’匹配百位数2的时候,[01]{0,1}会判断为匹配0次,然后直接进行下一个\d{0,1},这样就会匹配到'205'的2,最后在匹配\d,直接匹配到'205'的0,到此,匹配结束,返回'20'
|
|