勖少 發表於 2025-7-21 08:28:54

正则表达式IP地址合法性判断实战记录

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、正则表达式常见匹配字符快速回顾</a></li><li><a href="#_label1">二、 实战:正则表达式判断IPv4地址合法性</a></li><li><a href="#_label2">总结&nbsp;</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、正则表达式常见匹配字符快速回顾</h2>
<table><thead><tr><th>符号</th><th>描述</th></tr></thead><tbody><tr><td>.</td><td>匹配处换行符\n之外任意1个字符</td></tr><tr><td>[]</td><td>匹配[]中任意一个</td></tr><tr><td>\d</td><td>一个0-9数字</td></tr><tr><td>\D</td><td>匹配非数字</td></tr><tr><td>\w</td><td>匹配单词字符:a-z、A-Z、0-9</td></tr><tr><td>\W</td><td>匹配非单词字符</td></tr><tr><td>\s</td><td>匹配空格、tab健</td></tr><tr><td>\S</td><td>匹配非空格,tab健</td></tr></tbody></table>
<blockquote><p>常用的匹配规则-匹配字符数量</p></blockquote>
<ul><li><p>匹配前一个字符出现0次或者无数次</p></li><li><p>匹配前一个字符出现1次或者无数次</p></li></ul>
<table><thead><tr><th>符号</th><th>描述</th></tr></thead><tbody><tr><td>?</td><td>匹配前一个字符出现0次或者1次</td></tr><tr><td>{m}</td><td>匹配前一个字符出现m次</td></tr><tr><td>{m,}</td><td>匹配前一个字符出现至少m次</td></tr><tr><td>{n,m}</td><td>匹配前一个字符出现n-m次</td></tr><tr><td>^</td><td>匹配字符串开头</td></tr><tr><td>$</td><td>匹配字符串结尾</td></tr><tr><td>|</td><td>或</td></tr><tr><td>(ab)</td><td>将括号中字符作为一个分组</td></tr></tbody></table>
<p class="maodian"><a name="_label1"></a></p><h2>二、 实战:正则表达式判断IPv4地址合法性</h2>
<blockquote><p>python正则表达式处理re.match()函数,可以对字符进行匹配,查找的位置是从指定的位置开始一直往后找,返回第一个符合规则的对象,如果开始位置不符合匹配队形则返回None。而如果从起始位置开始没有匹配成功,即便其他部分包含需要匹配的内容,re.match()也会返回None。<br /><strong>忘记的同学可以去看上篇文章讲解</strong></p></blockquote>
<ul><li><p>问题:假设有一个IP地址,如ip = &lsquo;10.10.10.10&rsquo;,如何检测IPV4的IP地址格式是否正确?</p>
<blockquote><p>分析</p>
<p>IPV4地址分四段,分别为:(1-255).(0-255).(0-255).(0-255)</p>
<p><strong>第一段分析,有以下5种情况:</strong></p>
<table><thead><tr><th>1-9</th><th>1位数,由于是第一段,因此不能取0,1-9任意取</th></tr></thead><tbody><tr><td>10-99</td><td>1开头两位数,个位数0-9任意取</td></tr><tr><td>100-199</td><td>1开头三位数,十位数和个位数0-9任意取</td></tr><tr><td>200-249</td><td>2开头三位数,当十位数为0-4时(即250以内),个位数0-9任意取</td></tr><tr><td>250-255</td><td>2开头三位数,当十位数为5时(大于等于250),个位数只能取0-5</td></tr></tbody></table>
<p><strong>这五种情况对应的正则如下:</strong></p>
<table><thead><tr><th>1-9</th><th></th></tr></thead><tbody><tr><td>10-99</td><td>\d</td></tr><tr><td>100-199</td><td>1\d\d</td></tr><tr><td>200-249</td><td>2\d</td></tr><tr><td>250-255</td><td>25</td></tr></tbody></table>
<p><strong>组合起来就是:</strong></p>
<div class="jb51code"><pre class="brush:py;">|\d|1\d\d|2\d|25
</pre></div>
<p><strong>加个小括号组合起来:</strong></p>
<div class="jb51code"><pre class="brush:py;">(|\d|1\d\d|2\d|25)
</pre></div>
<p><strong>后三段情况均一样,有以下5中情况:</strong></p>
<table><thead><tr><th>0-9</th><th>1位数,0-9任意取,唯一与第一段有区别的地方</th></tr></thead><tbody><tr><td>10-99</td><td>1开头两位数,个位数0-9任意取</td></tr><tr><td>100-199</td><td>1开头三位数,十位数和个位数0-9任意取</td></tr><tr><td>200-249</td><td>2开头三位数,当十位数为0-4时(即250以内),个位数0-9任意取</td></tr><tr><td>250-255</td><td>2开头三位数,当十位数为5时(大于等于250),个位数只能取0-5</td></tr></tbody></table>
<p><strong>这五种情况对应的正则如下:</strong></p>
<table><thead><tr><th>0-9</th><th>\d</th></tr></thead><tbody><tr><td>10-99</td><td>\d</td></tr><tr><td>100-199</td><td>1\d\d</td></tr><tr><td>200-249</td><td>2\d</td></tr><tr><td>250-255</td><td>25</td></tr></tbody></table>
<p><strong>组合起来就是</strong></p>
<div class="jb51code"><pre class="brush:py;">\d|\\d|1\d\d|2\d|25
</pre></div>
<p>第四段最后需要加上结尾符号:$。表示终止匹配。</p></blockquote>
<p><strong>最终结果:</strong></p>
<div class="jb51code"><pre class="brush:py;">import re

ip1 = '100.10.10.253'
print(re.match(r'(|\d|1\d\d|2\d|25).(\d|\d|1\d\d|2\d|25).(\d|\d|1\d\d|2\d|25).(\d|\d|1\d\d|2\d|25)$',ip1))

*******************print*********************************
&lt;re.Match object; span=(0, 13), match='100.10.10.253'&gt;

ip2 = '0.10.10.253'
print(re.match(r'(|\d|1\d\d|2\d|25).(\d|\d|1\d\d|2\d|25).(\d|\d|1\d\d|2\d|25).(\d|\d|1\d\d|2\d|25)$',ip2))

*******************print*********************************
None
</pre></div></li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>总结&nbsp;</h2>
頁: [1]
查看完整版本: 正则表达式IP地址合法性判断实战记录