丶霁灵 发表于 2020-3-31 20:49:17

正则表达式4视频里爬取ip的疑问

小甲鱼的视频中爬取IP地址用的正则表达式:
r'(?:(?:?\d?\d?|2\d|25\.){3}(?:?\d?\d?|2\d|25))'
被弹幕指出IP地址最后一位数超过200就会出现BUG
然后改成先匹配高位数字就可以解决
我一直没搞懂是为什么?

小小小菜菜菜 发表于 2020-3-31 23:58:44

因为匹配时按照正则表达式的顺序去匹配,匹配的时候又是按照字符去匹配,所以255去匹配时由于?\d?\d?在前所以匹配到就认为匹配通过结束了

丶霁灵 发表于 2020-4-1 13:47:58

小小小菜菜菜 发表于 2020-3-31 23:58
因为匹配时按照正则表达式的顺序去匹配,匹配的时候又是按照字符去匹配,所以255去匹配时由于?\d?\d? ...

是第几位的255匹配第几位的??{:10_285:}

flamezyy 发表于 2020-4-1 14:39:39

本帖最后由 flamezyy 于 2020-4-1 14:41 编辑

首先你的正则表达式有问题,我不知道是小甲鱼写错了还是你抄错了
r'(?:(?:?\d?\d?|2\d|25)\.){3}(?:?\d?\d?|2\d|25)'
正确的应该这样写
而这样写会有个问题:
>>> p = r'(?:(?:?\d?\d?|2\d|25)\.){3}(?:?\d?\d?|2\d|25)'
>>> re.findall(p, '192.168.1.1')
['192.168.1.1']
>>> re.findall(p, '256.255.255.255')
['56.255.255.25']
虽然能正常匹配一般IP,但是当首位和末尾超过255时也会被匹配到,这是因为开始匹配后,虽然256不匹配,但是56匹配到了?\d?\d?,所以从56开始,而虽然255匹配到了25,但是由于25优先匹配了?\d?\d?,所以在25就结束了
解决方法也很简单,加上表示起始的^和表示终止的$即可:
p = r'^(?:(?:?\d?\d?|2\d|25)\.){3}(?:?\d?\d?|2\d|25)这里是终止符'
>>> re.findall(p, '256.255.255.255')
[]
>>> re.findall(p, '192.168.1.1')
['192.168.1.1']
页: [1]
查看完整版本: 正则表达式4视频里爬取ip的疑问