鱼C论坛

 找回密码
 立即注册
查看: 2337|回复: 6

[已解决]关于小甲鱼第57讲正则表达式视频最后提到的bug的解答

[复制链接]
发表于 2019-8-21 22:47:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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出在什么地方呢?实在是看不出来问题在什么地方,求大神解答啊
最佳答案
2019-8-22 13:15:07
{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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-22 13:15:07 | 显示全部楼层    本楼为最佳答案   
{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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-22 16:16:02 | 显示全部楼层
jinlovelive 发表于 2019-8-22 13:15
{0,1}匹配0次或1次。这样就很明显了,因为匹配0-199的表达式排在最前面所以先执行的是r'[01]{0,1}\d{0,1}\d ...

哦,明白了,非常感谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 23:32:06 | 显示全部楼层
那为啥 ‘200.168.201.254’  前面的200和201 能匹配成功,只有254 匹配出25?(这个匹配出来是200.168.201.25)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-9 05:09:02 | 显示全部楼层
chenfantech 发表于 2021-3-9 23:32
那为啥 ‘200.168.201.254’  前面的200和201 能匹配成功,只有254 匹配出25?(这个匹配出来是200.168.201 ...

同问!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-11 21:30:46 | 显示全部楼层
jinlovelive 发表于 2019-8-22 13:15
{0,1}匹配0次或1次。这样就很明显了,因为匹配0-199的表达式排在最前面所以先执行的是r'[01]{0,1}\d{0,1}\d ...

你好小甲鱼正则表达式匹配IP地址是这样写的:
re.search(r'[01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5]', '206')
但是我觉得这样就行了吧:
re.search(r'[1]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5]', '206'),我去掉了从左往右数的第一个0,第一个0没什么意义吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-15 06:28:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表