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. C#在循环中使用Random时生成的随机数相同的解决办法

    场景 在循环中使用 Random y = new Random(); 生成随机数时每次循环生成的数是一样的. ; i < ;i++ ) { Random y = new Random(); Po ...

  2. java笔记----cpu消耗快速定位代码

    下载ProcessExplorer ProcessExplorer下载地址:ProcessExplorer 下载运行代码 打开ProcessExplorer 查看javaw.exe的pid jstac ...

  3. JS基础语法---分支语句总结

    分支语句: if语句:一个分支 if-else语句:两个分支,最终只执行一个分支 if-else if-else if...语句: 多个分支,也是只会执行一个 switch-case语句:多分支语句, ...

  4. 【XML】利用Dom4j读取XML文档以及写入XML文档

    Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ...

  5. 配置同时使用 Gitlab、Github、Gitee(码云) 共存的开发环境

    首先确认已安装Git,可以通过 git –version 命令可以查看当前安装的版本. Mac OSX 中都已经安装了Git.但是,Git的版本未必是最新的. 可以通过命令 git clone htt ...

  6. mssql 单引号插入到sqlserver的方法分享

    转自:http://www.maomao365.com/?p=6740 摘要: 下文讲述sqlserver操作中遇到单引号的处理方法sqlserver 数据库中可以存储任何字符,因为在数据库中字符都是 ...

  7. mysql里面alter的用法

    1:删除列 ALTER TABLE [表名字] DROP [列名称] 2:增加列 ALTER TABLE [表名字] ADD [列名称] INT NOT NULL  COMMENT '注释说明' 3: ...

  8. Linux:路径的概念及路径的切换

    路径分为绝对路径和相对路径 绝对路径:从/根开头的路径为绝对路径 相对路径:以当前目录为开头的为相对路径 根目录:/ 家目录:普通用户的家目录在/home下,root用户的家目录是/root 切换目录 ...

  9. CSS百分比padding实现比例固定图片自适应布局

    一.CSS百分比padding都是相对宽度计算的 在默认的水平文档流方向下,CSS margin和padding属性的垂直方向的百分比值都是相对于宽度计算的,这个和top, bottom等属性的百分比 ...

  10. linux passwd批量修改用户密码

    linux passwd批量修改用户密码 对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用 passwd user 这样的命令来修改密码,但是这样会进入交互模式,即使使用脚本也不 ...