您的位置:首页 > 其它

正则表达式——IP地址的匹配

2017-06-01 00:49 253 查看
我在中国大学MOOC上学习正则表达式的时候,在学习IP地址的匹配的时候,发现了视频里的匹配IP地址的正则表达式是错误的
IPV0地址分四段,每段数字范围为0-255,段与段之间用英文句点'.'隔开
其中,
250-255: 特点:三位数,百位数是2,十位是5,个位是0-5,用正则表达式可以写成:25[0-5]
200-249: 特点:三位数,百位数是2,十位是0-4,个位是0-9,用正则表达式可以写成:2[0-4]\d
100-199:特点: 三位数,百位数是1,十位,个位是0-9,用正则表达式可以写成:1\d{2}
10-99:特点:二位数,十位是1-9,个位数0-9,用正则表达式可以写成:[1-9]\d
0-9:特点:一位数,用正则表达式可以写成:\d

综上:可以将0-99的正则表达式写成:[1-9]?\d (?表示前一个字符0次或1次扩展)

以上,视频里还是正确的,但是其正则表达式是这样的:
(([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]).){3}([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5])
我们分解来看
([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]),这一部分是说匹配数字0-255,咋看起来没错,但是因为最先开始的匹配拥有最高的优先权,也就是说,对于202.204.80.112这样的,先匹配的是2而不是202
其次,该表达式中的 .
意味着匹配所有单个字符,这也就说明即使把IP改成202$204$80$112他也会匹配成功,这明显是不对的

将上述正则表达式验证一下:



他只能匹配到202.204;因为他首先匹配了2接着把0作为单个字符匹配,同理是2. 接着是20 最后是匹配了4(正好是四组)

只需要将正则表达式改成这样:

((1\d{2}|25[0-5]|2[0-4]\d|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)问题即可解决。

代码如下:
import
re
right=r'((1\d{2}|25[0-5]|2[0-4]\d|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)'
n=re.search(right,'202.204.80.112')
print(n.group(0))

#输出:202.204.80.112
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: