python中利用正则表达式匹配ip地址
现在有一道题目,要求利用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地址的更多相关文章
- python 利用正则表达式获取IP地址
例:import retest= '$MYNETACT: 0,1,"10.10.0.9"'pattern =re.compile(r'"(\d+\.\d+\.\d+\.\ ...
- python 正则表达式匹配IP地址
一.实验环境 1.Windows7x64_SP1 2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 3.pyinstaller3.0 二.实验目的 从tex ...
- 使用正则表达式匹配IP地址
IP地址分为4段,以点号分隔.要对IP地址进行匹配,首先要对其进行分析,分成如下部分,分别进行匹配: 第一步:地址分析,正则初判 1.0-9 \d 进行匹配 2.10-99 [1-9]\d 进行匹 ...
- 正则表达式匹配IP地址
'''首先分析ip地址的特征:255.255.255.255,前三位的数字处理基本一致 1位: 0-9 \d2位:10-99 [1-9]\d3位:100-19 ...
- 【Oracle】oracle利用正则表达式拆分IP地址
使用oracle提供的regexp_substr()函数,对将IPV4地址分成4段: select v.ip as ip_address, regexp_substr(v.ip,,) as A, re ...
- 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
- Python 使用正则表达式匹配IP信息
使用正则表达式匹配IP地址 .MAC地址 .网卡名称: #!/usr/bin/env python #-*- coding:utf-8 -*- import re from subprocess im ...
- 正则表达式通用匹配ip地址及主机检测
在使用正则表达式匹配ip地址时如果不限定ip正确格式,一些场景下可能会产生不一样的结果,比如ip数值超范围,ip段超范围等,在使用正则表达式匹配ip地址时要注意几点: 1,字符界定:使用 \< ...
- 在Python中使用正则表达式同时匹配邮箱和电话并进行简单的分类
在Python使用正则表达式需要使用re(regular exprssion)模块,使用正则表达式的难点就在于如何写好p=re.compile(r' 正则表达式')的内容. 下面是在Python中使用 ...
随机推荐
- word中插入的代码库设置局部背景色
https://zhidao.baidu.com/question/1494951482361210539.html
- bzoj3007 解救小云公主
3007: 解救小云公主 Time Limit: 5 Sec Memory Limit: 512 MB Submit: 159 Solved: 71 [id=3007" style=&q ...
- C语言中的const,free使用方法具体解释
注意:C语言中的const和C++中的const是有区别的,并且在使用VS编译測试的时候. 假设是C的话.请一定要建立一个后缀为C的文件.不要是CPP的文件. 由于.两个编译器会有区别的. 一.C语言 ...
- ModelSim之TCL仿真
在使用ModelSim时,我们一般都是从界面UI进行操作的,这样也比较直观易学.但是在很多的调试时,发现很多操作都是重复的,修改一下代码就要再次进行相关操作,这样很没有效率.其实,ModelSim是可 ...
- 转:USB枚举
- css系列(4)简介
本节用来简单介绍css. (1)css: CSS 指层叠样式表 (Cascading Style Sheets): 功能以及作用:1.样式定义如何显示 HTML 元素; 2.样式通常存 ...
- Oracle常用的OCI函数
一. Oracle oci工具包安装: $ORACLE_HOME\BIN:执行文件和help文件 $ORACLE_HOME\OCI\INCLUDE:头文件 $ORACLE_HOME\OCI\LIB\B ...
- P3825 [NOI2017]游戏
题目 P3825 [NOI2017]游戏 做法 \(x\)地图外的地图好做,模型:\((x,y)\)必须同时选\(x \rightarrow y,y^\prime \rightarrow x^\pri ...
- Go 字符串相关-标准库
标准库中有四个包对字符串处理尤为重要: bytes strings strconv unicode strings包提供了许多如字符串的查询.替换.比较.截断.拆分和合并等功能. bytes包也提供了 ...
- Django object filter查询[转]
用PYTHON ,DJANGO 做站,在通常的情况下,需要用到 orM 的查询方法,比如object.filter(tag__contains='keywords').... 在这种情况下,如果你跟踪 ...