大尾巴扁气球鼓 发表于 2019-8-21 22:47:08

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

刚学完小甲鱼第一节正则表达式的视频(第57讲),关于ip地址相关的正则表达式,小甲鱼在视频最后给出的方法在视频中提示还有一个小bug,试了一下,果然是有个bug

>>> import re
>>> re.search(r'{0,1}\d{0,1}\d|2\d|25', '206')
<re.Match object; span=(0, 2), match='20'>
>>> re.search(r'{0,1}\d{0,1}\d|2\d|25', '253')
<re.Match object; span=(0, 2), match='25'>
>>> re.search(r'{0,1}\d{0,1}\d|2\d|25', '237')
<re.Match object; span=(0, 2), match='23'>
>>> re.search(r'2\d', '206')
<re.Match object; span=(0, 3), match='206'>
>>> re.search(r'2\d', '237')
<re.Match object; span=(0, 3), match='237'>
>>> re.search(r'25', '253')
<re.Match object; span=(0, 3), match='253'>

如上所示,针对IP地址中四个0-255的数字,视频中小甲鱼最后给出的正则表达式为{0,1}\d{0,1}\d|2\d|25,这个表达式在数字超过200之后就只能匹配上前两位了,而单独使用2\d和25匹配超过200之后的数字又是可以的,这里的bug出在什么地方呢?实在是看不出来问题在什么地方,求大神解答啊

jinlovelive 发表于 2019-8-22 13:15:07

{0,1}匹配0次或1次。这样就很明显了,因为匹配0-199的表达式排在最前面所以先执行的是r'{0,1}\d{0,1}\d‘,匹配超过200的数时,比如'205‘时,’匹配百位数2的时候,{0,1}会判断为匹配0次,然后直接进行下一个\d{0,1},这样就会匹配到'205'的2,最后在匹配\d,直接匹配到'205'的0,到此,匹配结束,返回'20'

大尾巴扁气球鼓 发表于 2019-8-22 16:16:02

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

哦,明白了,非常感谢~

chenfantech 发表于 2021-3-9 23:32:06

那为啥 ‘200.168.201.254’前面的200和201 能匹配成功,只有254 匹配出25?(这个匹配出来是200.168.201.25)

locrosse 发表于 2021-4-9 05:09:02

chenfantech 发表于 2021-3-9 23:32
那为啥 ‘200.168.201.254’前面的200和201 能匹配成功,只有254 匹配出25?(这个匹配出来是200.168.201 ...

同问!

123Marchapril 发表于 2021-5-11 21:30:46

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

你好小甲鱼正则表达式匹配IP地址是这样写的:
re.search(r'{0,1}\d{0,1}\d|2\d|25', '206')
但是我觉得这样就行了吧:
re.search(r'{0,1}\d{0,1}\d|2\d|25', '206'),我去掉了从左往右数的第一个0,第一个0没什么意义吧?

龙舞九天 发表于 2021-5-15 06:28:05

{:5_95:}
页: [1]
查看完整版本: 关于小甲鱼第57讲正则表达式视频最后提到的bug的解答