鱼C论坛

 找回密码
 立即注册
查看: 627|回复: 3

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

[复制链接]
发表于 2020-3-31 20:49:17 | 显示全部楼层 |阅读模式

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

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

x
小甲鱼的视频中爬取IP地址用的正则表达式:
r'(?:(?:[0,1]?\d?\d?|2[0,4]\d|25[0,5]\.){3}(?:[0,1]?\d?\d?|2[0,4]\d|25[0,5]))'
被弹幕指出IP地址最后一位数超过200就会出现BUG
然后改成先匹配高位数字就可以解决
我一直没搞懂是为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-31 23:58:44 From FishC Mobile | 显示全部楼层
因为匹配时按照正则表达式的顺序去匹配,匹配的时候又是按照字符去匹配,所以255去匹配时由于[0,1]?\d?\d?在前所以匹配到就认为匹配通过结束了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-1 13:47:58 | 显示全部楼层
小小小菜菜菜 发表于 2020-3-31 23:58
因为匹配时按照正则表达式的顺序去匹配,匹配的时候又是按照字符去匹配,所以255去匹配时由于[0,1]?\d?\d? ...

是第几位的255匹配第几位的??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 14:39:39 | 显示全部楼层
本帖最后由 flamezyy 于 2020-4-1 14:41 编辑

首先你的正则表达式有问题,我不知道是小甲鱼写错了还是你抄错了
r'(?:(?:[0,1]?\d?\d?|2[0,4]\d|25[0,5])\.){3}(?:[0,1]?\d?\d?|2[0,4]\d|25[0,5])'
正确的应该这样写
而这样写会有个问题:
>>> p = r'(?:(?:[0,1]?\d?\d?|2[0,4]\d|25[0,5])\.){3}(?:[0,1]?\d?\d?|2[0,4]\d|25[0,5])'
>>> 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匹配到了[0,1]?\d?\d?,所以从56开始,而虽然255匹配到了25[0,5],但是由于25优先匹配了[0,1]?\d?\d?,所以在25就结束了
解决方法也很简单,加上表示起始的^和表示终止的$即可:
p = r'^(?:(?:[0,1]?\d?\d?|2[0,4]\d|25[0,5])\.){3}(?:[0,1]?\d?\d?|2[0,4]\d|25[0,5])这里是终止符'
>>> re.findall(p, '256.255.255.255')
[]
>>> re.findall(p, '192.168.1.1')
['192.168.1.1']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 12:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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