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‘>

第二步:尝试匹配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"[0-255]", "255")
<_sre.SRE_Match object; span=(0, 1), match=‘2‘>

如下图,第一个[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=‘100‘>
>>> 

为什么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]

原文地址:https://www.cnblogs.com/cnhkzyy/p/9210605.html

时间: 2024-07-30 23:50:59

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

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

如何使用正则表达式匹配IP地址?这是很常见的任务.说难也难,说易也易,取决于在匹配的精确度以及正则表达式复杂度之间很好的折中. 通常,IP地址以点分十进制方式表示,IP地址分为4段,以点号分隔.要对IP地址进行匹配,首先要对其进行分析.0.0.0.0 - 255.255.255.255 一个简单的正则表达式: [0-9]+(?:\.[0-9]+){0,3} 或者 ^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$ 它能够完成我们的任务,但是像"3948.3.89.34238"

正则表达式匹配IP地址

'''首先分析ip地址的特征:255.255.255.255,前三位的数字处理基本一致 1位: 0-9              \d2位:10-99         [1-9]\d3位:100-199      1\d\d3位:200-249      2[0-4]\d3位:250-255      25[0-5] ''' 先匹配前三位数字: (\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]) 前三位加上 . ((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0

正则表达式----------匹配IP地址

正则表达式 ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9

python 正则RE匹配IP地址

使用re库匹配IP地址 一.说明 ip地址为xxx.xxx.xxx.xxx,其中xxx为0-255直接数字. 本文匹配为(1-255).(0-255).(0-255).(1-254) 二.匹配表达式 1 ip_match = r"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[1-9])\.)(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){2}(?:25[0-4]|2[0-4][0-9]|1[0-9][0-

【转载】Python使用中文正则表达式匹配指定中文字符串的方法示例

本文实例讲述了Python使用中文正则表达式匹配指定中文字符串的方法.分享给大家供大家参考,具体如下: 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别.

如何理解Python中的正则表达式(2)

今天小编要跟大家分享的文章是如何理解Python中的正则表达式(2)?上节课我们简单认识了一下Python中的正则表达式,这节课我们继续了解Python正则表达式的相关内容,Python入门新手和正在Python学习的小伙伴快来看一看吧,希望能够对大家有所帮助 ! 今天为大家解决上节课中的部分疑问,比如r代表什么,来一起学习吧: 有同学问起昨天那段测试代码里的问题,我来简单说一下. 1. r”hi” 这里字符串前面加了r,是raw的意思,它表示对字符串不进行转义.为什么要加这个?你可以试试pri

Python中re(正则表达式)模块函数学习

今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. 方法/属性 作用 match() 决定 RE 是否在字符串刚开始的位置匹配 search() 扫描字符串,找到这个 RE 匹配的位置 findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回 finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回 match() 函数只检查 RE 是否在字符串开始处匹配

Python学习-37.Python中的正则表达式

作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块. 1 import re 这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何小写字符),$代表结尾,这些百科或者其他书籍都有. 例子一,字符串中是否包含数字: 1 import re 2 userinput = input("please input test string:") 3 if re.match(r'\d',userinput): 4 print(

Java 正则表达式匹配邮箱地址

作者 : 卿笃军 正则表达式中的部分元字符: 元字符 正则表达式中的写法 意义 . . 代表任意一个字符 \d \\d 代表0~9的任何一个数字 \D \\D 代表任何一个非数字字符 \s \\s 代表空白字符,如:'\t','\n' \S \\S 代表非空白字符 \w \\w 代表柯用作标示符的字符,单不包括'$' \W \\W 代表不可用作标示符的字符 . . 正则表达式,限定修饰符: 限定修饰符 意义 示例 ? 0次或1次 A? * 0次或多次 A* + 1次或多次 A+ {n} 正好出现