ip地址是用3个‘.‘号作为分隔符,分割4个数字,每个数字的取值在[0,255],一般日志文件中的ip地址都是有效的ip地址,不需要我们再去验证,因此,若从日志文件中提取ip,那么可以简单写成这样:
- >>> import re
- >>> s=‘kkk 192.168.1.136 kkk 192.168.1.137 kk 192.168.1.138 kk‘
- >>> l=re.findall(r‘\d+.\d+.\d+.\d+‘, s)
- >>> print l
- [‘192.168.1.136‘, ‘192.168.1.137‘, ‘192.168.1.138‘]
如果s中的ip地址有可能是无效的,那我们就需要在匹配的过程中,增加判断是否有效的操作,
正确的ip地址是以‘.‘作为分隔符,如果以‘,‘或者其他的字符作为分隔符是不对的,因此我们需要对分隔符进行验证:
- >>> s=‘kkk 192,168,1,136 kkk 192.168.1.137 kk 192.168.1.138 kk‘
- >>> l=re.findall(r‘\d+.\d+.\d+.\d+‘, s)
- >>> print l
- [‘192,168,1,136‘, ‘192.168.1.137‘, ‘192.168.1.138‘]
- >>> l=re.findall(r‘\d+\.\d+\.\d+\.\d+‘,s)
- >>> print l
- [‘192.168.1.137‘, ‘192.168.1.138‘]
ip地址中每个数字的取值在[0,255],因此需要验证每个数字的取值对否有效:
- >>> s=‘kkk 192.168.1.336 kkk 192.168.1.137 kk 192.168.1.138 kk‘
- >>> l=re.findall(r‘\d+\.\d+\.\d+\.\d+‘,s)
- >>> print l
- [‘192.168.1.336‘, ‘192.168.1.137‘, ‘192.168.1.138‘]
下面的匹配方法可以验证数字的大小:
- >>> s=‘kkk 192.288.1.136 kkk 192.168.1.137 kk 192.168.1.138 kk‘
- >>> l=re.findall(r‘(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)‘,s)
- >>> print l
- [‘192.168.1.137‘, ‘192.168.1.138‘]
- >>> l=re.findall(r‘(?:(?:25[0-5]|2[0-4]\d|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)‘,s)
- >>> print l
- [‘192.168.1.137‘, ‘192.168.1.138‘]
但是上述匹配在下面的情况下依然会出错:(ip地址中超出范围的数字是该ip地址最后一个或第一个)
- >>> s=‘kkk 192.137.1.336 kkk 1192.168.1.137 kk 192.168.1.138 kk‘
- >>> l=re.findall(r‘(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)‘,s)
- >>> print l
- [‘192.137.1.33‘, ‘192.168.1.137‘, ‘192.168.1.138‘]
这时应如何解决呢?下面是匹配ip地址的常用版本1:
- >>> s=‘kkk 192.137.1.336 kkk 1192.168.1.137 kk 192.168.1.138 kk‘
- >>> l=re.findall(r‘\b(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b‘,s)
- >>> l
- [‘192.168.1.138‘]
- >>> l=re.findall(r‘\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b‘,s)
- >>> l
- [‘192.168.1.138‘]
- >>> s=‘kkk 192.137.1.336 kkk 192.168.1.137.123 kk 192.168.1.138 kk‘
- >>> l=re.findall(r‘\b(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b‘,s)
- >>> print l
- [‘192.168.1.137‘, ‘192.168.1.138‘]
这种情况可这样解决,使用常用版本2:
- >>> s=‘kkk 192.137.1.336 kkk 192.168.1.137.123 kk 192.168.1.138 kk‘
- >>> l=re.findall(r‘(?<![\.\d])(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?![\.\d])‘,s)
- >>> print l
- [‘192.168.1.138‘]
综上所述:
1》若从日志文件中提取ip,那么可以简单写成这样:
- re.findall(r‘\d+\.\d+\.\d+\.\d+‘,s)
2》如需要验证ip地址,一般使用下面2种方法:
- re.findall(r‘\b(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b‘,s)
- re.findall(r‘\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b‘,s)
- re.findall(r‘(?<![\.\d])(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?![\.\d])‘,s)
- re.findall(r‘(?<![\.\d])(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?![\.\d])‘,s)
python匹配ip地址
原文:http://www.cnblogs.com/monsteryang/p/6533629.html