一、实验环境
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 aa.bb.cc.dd
2.2 编写函数读取文本文件,筛选合法IP地址
def get_ip_list(self): try: file = open(self.smart_ip_list_file, 'r') str = file.readlines() str_del_enter = [x.strip(' ') for x in str] #去除 comp = re.compile(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: self.ui.textEdit.setText('读取"%s"报错' %(self.smart_ip_list_file)) return []
2.3 代码说明
1.从文本文件中读取所有行,除首行外均以 结束,如下代码用于去除
str_del_enter = [x.strip(' ') 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 = re.compile(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}')