现在有一道题目,要求利用python中re模块来匹配ip地址,我们应如何着手?

首先能想到的是ip地址是数字,正则表达式是如何匹配数字的呢?

\d或[0-9]

对于这个问题,不要一下子上来就写匹配模式,应该一步步分解,把复杂的问题简单化

比如ip地址,我们可以总结一下规律

1. 它是一个字符串

2. 字符串内部是由4个1-3位的数字和3个.组成

3. 数字的范围是0-255

接下来,我们先试一下匹配第1个数字

第一步:尝试匹配192.168.100.123中的192

>>> import re
>>> re.search(r"\d\d\d", "192.168.100.123")
<_sre.SRE_Match object; span=(0, 3), match='>

第二步:尝试匹配192.168.100.123中的192.

值得注意的是,由于正则表达式中的元字符 . 表示除了\n之外的任意一个字符,我们需要匹配 . 本身,就需要用 \ 进行转义

>>> re.search(r"\d\d\d\.", "192.168.100.12")
<_sre.SRE_Match object; span=(0, 4), match='192.'>

第三步:尝试匹配192.168.100.123的整体

>>> re.search(r"\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d", "192.168.100.123")
<_sre.SRE_Match object; span=(0, 15), match='192.168.100.123'>

这样写有什么问题呢?

1. 我们的数字并不都是3位,像192.168.100.1这样的,我们的匹配模式就失效了

>>> re.search(r"\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d", "192.168.100.1")
>>> 

2. 不够美观

第四步:优化误区一

很多人一上手,就写成了[0-255],这不就是数字的范围0-255吗?我们说,这样是不对的

正则表达式中,真正要匹配的永远是字符串,一个字符串内部是由三位的数字构成的,如果需要匹配三位数字的形式,就需要用到[0-9][0-9][0-9]或\d\d\d,用一个[0-9]表示的只能匹配一位,[0-255]这种错误的写法也只能匹配到一位0-9之间的数字

>>> re.search(r")
<_sre.SRE_Match object; span=(0, 1), match='>

如下图,第一个[0-255]匹配到了1, \.匹配到了.

这个ip地址中根本没有 1. 这种形式的,所以返回了None

>>> re.search(r"[0-255]\.[0-255]\.[0-255]\.[0-255]", "192.168.100.1")
>>> 

优化误区二:

既然上面的不对,那能不能把255分解成 2, 5, 5, 我们匹配时能否写成[0-2][0-5][0-5],看似是没问题的,我们来试试

>>> re.search(r"[0-2][0-5][0-5]", "192.168.100.1")
<_sre.SRE_Match object; span=(8, 11), match='>
>>> 

为什么192没有匹配到?168也没有匹配到?因为数字的十位和个位最大只能是5,超过5的肯定没法匹配

第五步:继续优化

我们来看下0-255这个范围,当百位是0或者1时,十位和个位可以是[0-9],也就是\d,当百位是2时,十位是[0-4]时,个位可以是\d,当百位是2时,十位是5时,个位只能是[0-5],那么,我们是不是可以这样来写,比如匹配192,匹配模式可以写成

[01]\d\d|2[0-4]\d|25[0-5]

如果有重复的,我们可以给上面的模式加上 {n} 表示重复匹配前面的字符n次

>>> re.search(r"(([01]\d\d|2[0-4]\d|25[0-5]\d)\.){3}([01]\d\d|2[0-4]\d|25[0-5]\d)", "192.168.100.123")
<_sre.SRE_Match object; span=(0, 15), match='192.168.100.123'>

看似正确了,但是还是匹配不到数字 1 ,因为我们的百位是[01],意味这如果是 1 的情况下,我们的结果是001,但ip地址是不能写成001, 002的

>>> re.search(r"(([01]\d\d|2[0-4]\d|25[0-5]\d)\.){3}([01]\d\d|2[0-4]\d|25[0-5]\d)", "192.168.100.1")
>>> 
>>> re.search(r"(([01]\d\d|2[0-4]\d|25[0-5]\d)\.){3}([01]\d\d|2[0-4]\d|25[0-5]\d)", "192.168.100.001")
<_sre.SRE_Match object; span=(0, 15), match='192.168.100.001'>
>>> 

可以通过{0,1}来优化,表示前面的字符重复0-1次,也可以用 ?

>>> re.search(r"(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5]\d)\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5]\d)", "192.168.100.1")
<_sre.SRE_Match object; span=(0, 13), match='192.168.100.1'>

>>> re.search(r"(([01]?\d?\d|2[0-4]\d|25[0-5]\d)\.){3}([01]?\d?\d|2[0-4]\d|25[0-5]\d)", "192.168.100.1")
<_sre.SRE_Match object; span=(0, 13), match='192.168.100.1'>

这样,当数字只有个位时,百位的0匹配0次,十位的0匹配0次,只留下个位数字[0-9]

python中利用正则表达式匹配ip地址的更多相关文章

  1. python 利用正则表达式获取IP地址

    例:import retest= '$MYNETACT: 0,1,"10.10.0.9"'pattern =re.compile(r'"(\d+\.\d+\.\d+\.\ ...

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

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

  3. 使用正则表达式匹配IP地址

    IP地址分为4段,以点号分隔.要对IP地址进行匹配,首先要对其进行分析,分成如下部分,分别进行匹配:   第一步:地址分析,正则初判 1.0-9 \d 进行匹配 2.10-99 [1-9]\d 进行匹 ...

  4. 正则表达式匹配IP地址

    '''首先分析ip地址的特征:255.255.255.255,前三位的数字处理基本一致 1位: 0-9              \d2位:10-99         [1-9]\d3位:100-19 ...

  5. 【Oracle】oracle利用正则表达式拆分IP地址

    使用oracle提供的regexp_substr()函数,对将IPV4地址分成4段: select v.ip as ip_address, regexp_substr(v.ip,,) as A, re ...

  6. C# 正则表达式 匹配IP地址

    \b(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5])\b

  7. Python 使用正则表达式匹配IP信息

    使用正则表达式匹配IP地址 .MAC地址 .网卡名称: #!/usr/bin/env python #-*- coding:utf-8 -*- import re from subprocess im ...

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

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

  9. 在Python中使用正则表达式同时匹配邮箱和电话并进行简单的分类

    在Python使用正则表达式需要使用re(regular exprssion)模块,使用正则表达式的难点就在于如何写好p=re.compile(r' 正则表达式')的内容. 下面是在Python中使用 ...

随机推荐

  1. Android系统移植与调试之------->如何修改Android的默认语言、默认时区

    修改device/other/TBDG1073/ system.prop文件 1.设置默认语言 找到device/other/TBDG1073/ system.prop文件,修改属性ro.produc ...

  2. End to End 端到端

    在DeepLearning的文章中有看到end2end一次,作者们似乎都比较喜欢这个end2end learning的方式.那么到底啥是end2end? 找了一下相关论文,没找到专门讲这个概念的,看来 ...

  3. boost之智能指针

    内存问题永远是c++中讨论的重要话题 1.c98 auto_ptr的实现,auto_ptr的特点是始终只保持一个指针指向对象,若经过赋值或者拷贝之后原指针失效 #include <iostrea ...

  4. mysql分组查询

    有一张学生选课表 Table: Subject_Selection Subject Semester Attendee --------------------------------- ITB001 ...

  5. pyhton3 re模块

    本文转自 AstralWind 的博客:Python正则表达式指南 特来收藏 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有 ...

  6. SOA和微服务之间的区别

    近几年,我们有很多文章对SOA和微服务之间的不同点和相似点进行了分析.有些人认为SOA有很多地方是值得微服务学习的,而有些人则认为区别对待微服务和SOA会更好.而Neal Ford认为,将单体迁移到面 ...

  7. Linux sh远程连接失败 sshd.service启动失败

    今天不小心在本机的虚拟机执行了 chmod -R 777 /var 导致/var目录下所有权限全部是777 其中 /var/empty/sshd目录权限必须是744,却被改成了777,致使sh远程连接 ...

  8. 网络:W5500 UDP数据包格式注意事项

     1. 主题 使用W5500测试UDP功能,发现收到的数据包和wireshark抓包的数据不同. 原来W5500接收寄存器的数据包并不是网络上的数据流,而是经过内部处理后展现出来的. 对于这个问题目前 ...

  9. level-8

    CSS选择器常见的有几种? !important选择器——它是所有选择器里面权重最高的. *选择器——它是所有选择器里面权重最低的.可以为页面所有的标签添加统一样式,多用于页面整体样式调整,但它会增加 ...

  10. python日志操作logging

    步骤: 1.定义一个日志收集器 my_logger = logging.getLogger("kitty") 2.设定级别.默认为warning:debug,,info,error ...