ip地址是用3个'.'号作为分隔符,分割4个数字,每个数字的取值在[0,255],一般日志文件中的ip地址都是有效的ip地址,不需要我们再去验证,因此,若从日志文件中提取ip,那么可以简单写成这样:

  1. >>> import re
  2. >>> s='kkk 192.168.1.136 kkk 192.168.1.137 kk 192.168.1.138 kk'
  3. >>> l=re.findall(r'\d+.\d+.\d+.\d+', s)
  4. >>> print l
  5. ['192.168.1.136', '192.168.1.137', '192.168.1.138']

如果s中的ip地址有可能是无效的,那我们就需要在匹配的过程中,增加判断是否有效的操作,
正确的ip地址是以'.'作为分隔符,如果以','或者其他的字符作为分隔符是不对的,因此我们需要对分隔符进行验证:

  1. >>> s='kkk 192,168,1,136 kkk 192.168.1.137 kk 192.168.1.138 kk' #第一个ip地址以','作为分隔符,这是无效的ip地址
  2. >>> l=re.findall(r'\d+.\d+.\d+.\d+', s)# '.'能够匹配除了'\n'之外的任意一个字符(因此'.'可以匹配上',')
  3. >>> print l
  4. ['192,168,1,136', '192.168.1.137', '192.168.1.138'] #显然,第一个ip地址无效
  5. >>> l=re.findall(r'\d+\.\d+\.\d+\.\d+',s)  # '\.'可以精确的匹配'.'
  6. >>> print l
  7. ['192.168.1.137', '192.168.1.138']

ip地址中每个数字的取值在[0,255],因此需要验证每个数字的取值对否有效:

  1. >>> s='kkk 192.168.1.336 kkk 192.168.1.137 kk 192.168.1.138 kk'
  2. >>> l=re.findall(r'\d+\.\d+\.\d+\.\d+',s) #并没有验证每个数字的大小,导致第一个错误的ip地址也匹配上了
  3. >>> print l
  4. ['192.168.1.336', '192.168.1.137', '192.168.1.138'] #第一个ip地址是无效的,但错误的匹配上了

下面的匹配方法可以验证数字的大小:

  1. >>> s='kkk 192.288.1.136 kkk 192.168.1.137 kk 192.168.1.138 kk'
  2. >>> 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)
  3. >>> print l
  4. ['192.168.1.137', '192.168.1.138']
  5. #或者这样:
  6. >>> 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)
  7. >>> print l
  8. ['192.168.1.137', '192.168.1.138']

但是上述匹配在下面的情况下依然会出错:(ip地址中超出范围的数字是该ip地址最后一个或第一个)

  1. >>> s='kkk 192.137.1.336 kkk 1192.168.1.137 kk 192.168.1.138 kk' #第一个和第二个ip地址都无效,不应该匹配出来
  2. >>> 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)
  3. >>> print l
  4. ['192.137.1.33', '192.168.1.137', '192.168.1.138']#截取了第一个和第二个ip地址的一部分

这时应如何解决呢?下面是匹配ip地址的常用版本1:

  1. >>> s='kkk 192.137.1.336 kkk 1192.168.1.137 kk 192.168.1.138 kk'
  2. >>> 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)
  3. >>> l
  4. ['192.168.1.138']
  5. >>> 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)
  6. >>> l
  7. ['192.168.1.138']
  8. # '\b'表示符合要求的子串的第一个字符的前面和最后一个字符的后面不可以是'\w'字符(不可以是大小字母,数字,下划线)
  9. #上述版本比较常用,但也存在一点问题:
  10. >>> s='kkk 192.137.1.336 kkk 192.168.1.137.123 kk 192.168.1.138 kk'
  11. #第二个ip地址以'.'号作为分隔符,且每个数字在[0,255]之间,但该ip地址无效(多了一个数字)!!
  12. >>> 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)
  13. >>> print l
  14. ['192.168.1.137', '192.168.1.138'] #将第二个ip地址,截取了前4个数字,但显然第二个ip地址本应是无效的!!

这种情况可这样解决,使用常用版本2:

  1. >>> s='kkk 192.137.1.336 kkk 192.168.1.137.123 kk 192.168.1.138 kk'
  2. >>> 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)
  3. >>> print l
  4. ['192.168.1.138'] #准确的提取了ip地址!

综上所述:
1》若从日志文件中提取ip,那么可以简单写成这样:

  1. re.findall(r'\d+\.\d+\.\d+\.\d+',s)  # 适用于不需要验证ip地址的场合

2》如需要验证ip地址,一般使用下面2种方法:

    1. #2.1>
    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)
    3. #或:
    4. 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)
    5. #2.2>
    6. 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)
    7. #或:
    8. 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地址的更多相关文章

  1. Python 匹配IP地址的正则表达式

  2. python中利用正则表达式匹配ip地址

    现在有一道题目,要求利用python中re模块来匹配ip地址,我们应如何着手? 首先能想到的是ip地址是数字,正则表达式是如何匹配数字的呢? \d或[0-9] 对于这个问题,不要一下子上来就写匹配模式 ...

  3. python匹配ip正则

    python匹配ip正则 #!/usr/bin/env python # -*- coding:utf-8 -*- import re ip_str = "asdad1.1.1.1sdfwe ...

  4. 正则表达式通用匹配ip地址及主机检测

    在使用正则表达式匹配ip地址时如果不限定ip正确格式,一些场景下可能会产生不一样的结果,比如ip数值超范围,ip段超范围等,在使用正则表达式匹配ip地址时要注意几点: 1,字符界定:使用  \< ...

  5. python实现IP地址转换为32位二进制

    python实现IP地址转换为32位二进制 #!/usr/bin/env python # -*- coding:utf-8 -*- class IpAddrConverter(object): de ...

  6. python对ip地址排序、对列表进行去重

    一:使用python对ip地址排序所用代码示例一: import socket iplist = ['10.5.11.1','192.168.1.33','10.5.2.4','10.5.1.3',' ...

  7. Python实现IP地址归属地查询

    一.使用淘宝IP地址库查询 使用淘宝的Rest API,可以快速查询IP地址的归属地: 图00-淘宝IP地址库RestAPI使用说明 图01-使用淘宝免费IP地址库-查询IP归属地 存在问题:淘宝的免 ...

  8. python 正则表达式匹配IP地址

    一.实验环境 1.Windows7x64_SP1 2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 3.pyinstaller3.0 二.实验目的 从tex ...

  9. Linux下Python获取IP地址

    <lnmp一键安装包>中需要获取ip地址,有2种情况:如果服务器只有私网地址没有公网地址,这个时候获取的IP(即私网地址)不能用来判断服务器的位置,于是取其网关地址用来判断服务器在国内还是 ...

随机推荐

  1. SwiftUI学习(二)

    教程 2 - Building Lists and Navigation Section 4 - Step 2: 静态 List var body: some View { List { Landma ...

  2. JavaScript获取Django模板中指定键值的数据,使用过滤器

    Django中利用js来操作数据的常规操作一般为点(.)操作符来获取字典或列表的数据,一般如{{data.0}},{{data.arg}} 但有时如果数据是嵌套类型的数据时,直接获取某个值就变得困难了 ...

  3. zabbix4.0搭建1

    server端:负责接受到客户端发送过来的数据,并且保存到自己的数据库当中 端口:10051 agent端:负责每隔一定时间进行客户端的数据采集,并且发送给server端 端口:10050 proxy ...

  4. Oracle 导入dmp 故障存储文件

    创建表空间及用户CREATE TABLESPACE OracleDBFDATAFILE 'D:\app\zhoulx\oradata\bdc\OracleDBF.DBF' SIZE 100M AUTO ...

  5. apicloud如何实现优雅的下拉刷新与加载更多

    apicloud中提供下拉刷新监听事件api,也提供滚动到底部事件的监听,能够实现下拉刷新和滚动到底部加载更多功能,但是我们真的就满足实现功能了吗?将两个代码拼凑起来运行看看发现了什么?是的,在滚动到 ...

  6. python爬虫(2)——urllib、get和post请求、异常处理、浏览器伪装

    urllib基础 urlretrieve() urlretrieve(网址,本地文件存储地址) 直接下载网页到本地 import urllib.request #urlretrieve(网址,本地文件 ...

  7. angular 使用ng-zorro的from组件 运行报错

    emplate parse errors: Can't bind to 'formGroup' since it isn't a known property of 'form'. 原因:没有导入表单 ...

  8. http与Rpc

    RPC即远程服务调用 出现原因:随着项目越来越大,访问量越来越大,为了突破性能瓶颈,需要将项目拆分成多个部分,这样比起传统的项目都是本地内存调用,分布式的项目之间需要在网络间进行通信 服务之间的远程调 ...

  9. 树莓派开机主动发送自己的局域网ip/外网ip到你的微信

    开机时,树莓派主动发送自己的内网ip以及公网ip到你的微信上,这样就能方便地使用ssh或VNC. 操作步骤 下载目录下的 boot_getIP_send_Wechat.py 到你的 Raspberry ...

  10. linux常用终端命令

    01. 终端命令格式 command [-options] [parameter] 说明: command:命令名,相应功能的英文单词或单词的缩写 [-options]:选项,可用来对命令进行控制,也 ...