1、在写正则表达式前,需要知道什么是合法的网络ip(不识别本地和回路):
- ip地址由四个数字组成,每个数字之间用"."隔开
- 第一个数字不能为255,255为广播地址段
- 第一个数字不能为0,0为本地主机
- 第一个数字不能为127,127用于回路测试
- 其他三个数字为0-255之间的数字
2、写第一个数字的规则
- 单位数,不能为0 [1-9]
- 两位数,10-99
- 单位数和两位数可以合并表示为 [1-9]\d?
- 三位数
- 1开头 1[013456789]\d|1\d[012345689]
- 2开开头
- 25[0-4]
- 2[0-4]\d
所以第一个数字的表达式为:
[1-9]\d?|1[013456789]\d|1\d[012345689]|2[0-4]\d|25[0-4]
3、其余数字
同样分为一位数、二位数、三位数
- 一位数,[0-9]
- 二位数,[1-9]\d
- 三位数,1[\d]{2}, 2[0-4]\d, 25[0-5]
[0-9]|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5]
4、完整表达式
需要用?:让每个()内的分组表达式匹配的子字符串不被捕获,否则最终得到的结果将是由若干个字符串组成的元组,而不是ip地址,有兴趣的可以自己测试去掉?:后运行代码
a = '10.2.2.22'
result = re.findall(r'^(?:[1-9]\d?|1[013456789]\d|1\d[012345689]|2[0-4]\d|25[0-4])(?:\.(?:[0-9]|[1-9]\d?|1\d{2}|2[0-4]\d|25[0-5])){3}\Z', a)
print(result)
# ['10.2.2.22']
网友评论