python中利用正则表达式匹配ip地址
现在有一道题目,要求利用python中re模块来匹配ip地址,我们应如何着手?
首先能想到的是ip地址是数字,正则表达式是如何匹配数字的呢?
对于这个问题,不要一下子上来就写匹配模式,应该一步步分解,把复杂的问题简单化
比如ip地址,我们可以总结一下规律
1. 它是一个字符串
2. 字符串内部是由4个1-3位的数字和3个.组成
3. 数字的范围是0-255
接下来,我们先试一下匹配第1个数字
1|0第一步:尝试匹配192.168.100.123中的192
2|0第二步:尝试匹配192.168.100.123中的192.
值得注意的是,由于正则表达式中的元字符 . 表示除了\n之外的任意一个字符,我们需要匹配 . 本身,就需要用 \ 进行转义
3|0第三步:尝试匹配192.168.100.123的整体
3|1这样写有什么问题呢?
3|21. 我们的数字并不都是3位,像192.168.100.1这样的,我们的匹配模式就失效了
3|32. 不够美观
4|0第四步:优化误区一
很多人一上手,就写成了[0-255],这不就是数字的范围0-255吗?我们说,这样是不对的
正则表达式中,真正要匹配的永远是字符串,一个字符串内部是由三位的数字构成的,如果需要匹配三位数字的形式,就需要用到[0-9][0-9][0-9]或\d\d\d,用一个[0-9]表示的只能匹配一位,[0-255]这种错误的写法也只能匹配到一位0-9之间的数字
如下图,第一个[0-255]匹配到了1, \.匹配到了.
这个ip地址中根本没有 1. 这种形式的,所以返回了None
5|0优化误区二:
既然上面的不对,那能不能把255分解成 2, 5, 5, 我们匹配时能否写成[0-2][0-5][0-5],看似是没问题的,我们来试试
为什么192没有匹配到?168也没有匹配到?因为数字的十位和个位最大只能是5,超过5的肯定没法匹配
6|0第五步:继续优化
我们来看下0-255这个范围,当百位是0或者1时,十位和个位可以是[0-9],也就是\d,当百位是2时,十位是[0-4]时,个位可以是\d,当百位是2时,十位是5时,个位只能是[0-5],那么,我们是不是可以这样来写,比如匹配192,匹配模式可以写成
如果有重复的,我们可以给上面的模式加上 {n} 表示重复匹配前面的字符n次
看似正确了,但是还是匹配不到数字 1 ,因为我们的百位是[01],意味这如果是 1 的情况下,我们的结果是001,但ip地址是不能写成001, 002的
可以通过{0,1}来优化,表示前面的字符重复0-1次,也可以用 ?
这样,当数字只有个位时,百位的0匹配0次,十位的0匹配0次,只留下个位数字[0-9]
__EOF__

本文链接:https://www.cnblogs.com/my_captain/p/9210605.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2017-06-21 《Advanced Bash-scripting Guide》学习(二):测试脚本调用的参数是否正确