|
|
发表于 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']
复制代码 |
|