我在中国大学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