python正则表达式匹配IP地址
⼀、实验环境
1.Windows7x64_SP1
2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装)
3.pyinstaller3.0
⼆、实验⽬的
从text⽂本中获取字符串,筛选合法IP地址
2.1 ⽂本内容如下
请输⼊合法IP地址,⾮法IP地址和其他字符将被过滤!
增、删、改IP地址后,请保存、关闭记事本!
192.168.8.84
192.168.8.85
192.168.8.86
0.0.0.1
256.1.1.1
192.256.256.256
192.255.255.255
dd
2.2 编写函数读取⽂本⽂件,筛选合法IP地址
def get_ip_list(self):
python 正则表达式 空格try:
file = open(self.smart_ip_list_file, 'r')
str = adlines()
str_del_enter = [x.strip('\n') for x in str]                                                            #去除\n
comp = repile(r'^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}')
str_legal_ip = [x for x in str_del_enter if comp.match(x)]                                              #筛选合法IP地址
file.close()
return str_legal_ip
except:
Edit.setText('读取"%s"报错' %(self.smart_ip_list_file))
return [] 
2.3 代码说明
1.从⽂本⽂件中读取所有⾏,除⾸⾏外均以\n结束,如下代码⽤于去除\n
str_del_enter = [x.strip('\n') for x in str]
2.IP地址的长度为32位(共有2^32个IP地址),分为4段,每段8位,⽤⼗进制数字表⽰,每段数字范围为0~255,段与段之间⽤句点隔开 
根据规则:每段相同,范围都在 0 ~ 255
0~255 对应的正则表达式为 (2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2}
2(5[0-5]|[0-4]\d) 匹配:200 ~ 255
[0-1]?\d{1,2} 匹配:0 ~ 199
0 到 255 的式⼦已经写出来了,那么⼀共四段再加上中间的点就很容易了
后边“点”和“数字”重复三次就可以了,(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}
全部合起来,((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}
通过如上正则表达式匹配字符串,存在如下问题
256.1.1.1    ->    匹配结果56.1.1.1
解决⽅式,如上表达式前⾯添加^,最终调⽤compile函数,参数⽅式如下
comp = repile(r'^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}')