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. PHP面试题2019年搜狐面试题及答案解析

    一.单选题(共27题,每题5分) 1.阅读下面PHP代码,并选择输出结果( ) A.0 B.1 C.2 D.3 参考答案:D 答案解析:static属性常驻内存 2.PHP单例模式操作描述错误的是? ...

  2. C++ 成员对象和封闭类

    01 成员对象与封闭类 类里有其他对象则该对象叫成员对象:有成员对象的类叫 封闭类: class CTyre // 轮胎类 { public: // 有参数构造函数 // 初始化成员变量m_radiu ...

  3. 程序员编程时常用的mac快捷方式

    fn + F2/F3 = 调节音量 commend + shift +k = 显示或隐藏键盘 commend+shift +h = iPhone返回主页面 commend+ shift + hh = ...

  4. hitTest和pointInside如何响应用户点击事件

    hitTest和pointInside如何响应用户点击事件 处理机制 iOS事件处理,首先应该是找到能处理点击事件的视图,然后在找到的这个视图里处理这个点击事件. 处理原理如下: • 当用户点击屏幕时 ...

  5. 开源项目Telegram源码 Telegram for Android Source

    背景介绍 Telegram 是一款跨平台的即时通信软件,它的客户端是自由及开放源代码软件.用户可以相互交换加密与自毁消息,发送照片.影片等所有类型文件.官方提供手机版.桌面版和网页版等多种平台客户端. ...

  6. nuget 包管理器

    nuget 是.Net平台上的包管理器, 对于包的发布(打包 package)和消费(下载依赖管理)都有很好的支持, 本文仅仅关注消费端, =======================nuget项目 ...

  7. [b0006] Spark 2.0.1 伪分布式搭建练手

    环境: 已经安装好: hadoop 2.6.4  yarn 参考: [b0001] 伪分布式 hadoop 2.6.4 准备: spark-2.0.1-bin-hadoop2.6.tgz 下载地址:  ...

  8. Saltstack_使用指南11_配置管理-状态之间依赖关系

    1. 说明 下文的案例是根据上一篇文章进行的修改.因此请优先读取上一篇文章内容<Saltstack_10_配置管理-状态模块> 并且目录进行了变化,从 /srv/salt/lamp 变为了 ...

  9. liteos C++支持(十七)

    1 概述 1.1 基本概念 C++作为目前使用最广泛的编程语言之一,支持类.封装.重载等特性,是在C语言基础上开发的一种面向对象的编程语言. 1.2 运作机制 STL(Standard Templat ...

  10. [Linux] 使用mount来挂载设备到目录

    一般情况下直接mount 设备路径 目录路径,就可以了.umount 设备名,就可以卸载这个设备了使用lsblk -f可以查看挂载的设备,以及这些设备的文件系统. root@tao-PC:/boot# ...