Python判定IP地址合法性的三种方法
最简单的实现方法是构造一个正则表达式。判断用户的输入与正则表达式是否匹配。若匹配则是正确的IP地址,否则不是正确的IP地址。
下面给出相对应的验证ip的正则表达式:
^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$
\d表示0~9的任何一个数字
{2}表示正好出现两次
[0-4]表示0~4的任何一个数字
| 的意思是或者
1\d{2}的意思就是100~199之间的任意一个数字
2[0-4]\d的意思是200~249之间的任意一个数字
25[0-5]的意思是250~255之间的任意一个数字
[1-9]\d的意思是10~99之间的任意一个数字
[1-9])的意思是1~9之间的任意一个数字
\.的意思是.点要转义(特殊字符类似,@都要加\\转义)
代码如下:
import re
def check_ip(ipAddr):
compile_ip=re.compile('^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$')
if compile_ip.match(ipAddr):
return True
else:
return False
字符串拆解法
把ip地址当作字符串,以.为分隔符分割,进行判断
#!/usr/bin/python
import os,sys
def check_ip(ipAddr):
import sys
addr=ipAddr.strip().split('.') #切割IP地址为一个列表
#print addr
if len(addr) != 4: #切割后列表必须有4个参数
print "check ip address failed!"
sys.exit()
for i in range(4):
try:
addr[i]=int(addr[i]) #每个参数必须为数字,否则校验失败
except:
print "check ip address failed!"
sys.exit()
if addr[i]<=255 and addr[i]>=0: #每个参数值必须在0-255之间
pass
else:
print "check ip address failed!"
sys.exit()
i+=1
else:
print "check ip address success!"
if len(sys.argv)!=2: #传参加本身长度必须为2
print "Example: %s 10.0.0.1 "%sys.argv[0]
sys.exit()
else:
check_ip(sys.argv[1]) #满足条件调用校验IP函数
引入IPy类库
IPy库是一个处理IP比较强大的第三方库。涉及到计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等别担心,Ipy模块拯救你。Ipy模块可以很好的辅助我们高效的完成IP的规划工作。
IPy库的安装方法请根据自己的操作系统自行查找,有很多详细例子。
import IPy
def is_ip(address):
try:
IPy.IP(address)
return True
except Exception as e:
return False
总结 三种方法都能够准确的判断出ip(IP V4)地址的合法性, 正则表达式代码量少, 逻辑简单, 但是正则表达式繁琐, 字符串判定法容易理解,但是代码量大, 使用类库,判断简洁,但是需要引入额外的库。各有利弊, 使用时自行选择即可。
原文发布时间为:2018-09-20
本文作者:程序员共成长
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C++11部分特性
初识C++的时候,觉得会个STL就差不多了,后来发现了C++11这个东西,以及C++14,C++17QAQ,看了一下,好高深不学,emmmm真香= = 这里就只讲一下对ACM写代码有很高帮助的部分特性,因为大部分OJ和比赛只支持11,所以14和17就不讲了,然后还有C++11增加的元组tuple和几个容器另谈。 一、nullptr 在之前版本的c++中,NULL的值其实就是0,因为其实就是#define NULL 0,有些时候是((void *) 0)emmm,不说那些废话了。所以这些就会遇到一个问题, 例如下面这两个函数 1 int fun(char* ch){} 2 int fun(int num){} 当char ch = NULL,这样一个值去代入函数时,编译会调用下面那个函数,而不是第一个。而nullptr类型是nullptr_t,就是专门为了区别空指针和0,所以以后写代码nullptr代替NULL就能行了。 二、constexpr constexpr变量必须是一个常量,必须用常量表达式来初始化,例如下面代码 1 const int a = 10; 2 int b = 10;...
- 下一篇
WPF绘制深度不同颜色的3D模型填充图和线框图
原文: WPF绘制深度不同颜色的3D模型填充图和线框图 在机械测量过程中,测量的数据需要进行软件处理。通常测量一个零件之后,需要重建零件的3D模型,便于观察测量结果是否与所测工件一致。 重建的3D模型需要以填充图和线框图两种方式切换显示,其中填充图的材质需要根据不同深度进行着色,线框图需要消隐(不能透视)。以圆柱为例,如下图: 由于WPF对DirectX进行了封装,并构建出一套简单的3D绘图框架,因此我们可以快速的创建所需要的3D模型,便于像我这样的对三维计算机图形学不太了解的人进行开发。 关于WPF 3D绘图的基础,大家可以参考《Practical WPF Charts and Graphics》一书,里面也讲到一些3D显示的计算机图形学和数学基础。 下面我们开始3D模型的构建。 在WPF中,我们可以按如下步骤进行操作: 1、创建一个Viewport3D对象来host 三维模型; 2、继承ModelVisual3D或者ModelUIElement3D来定义3D对象; 3、指定3D场景中的光源,在WPF中光源也是一种ModelVisual3D; 4、创建一个相机来进行3D图形到2D显示...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Hadoop3单机部署,实现最简伪集群