经常会碰到匹配IP的问题,很多时候用粗略点方式,比如
\d{3}\.\d{3}\.\d{3}\.\d{3}
使用上面的就可以匹配,但有时候,要准确匹配的话,上面的显然就不行比如999.10.10.10显然就不是IP地址
(1-255).(0-255).(0-255).(0-254)上面四个其实还是正则的准匹配。
具体而言
- 百位: 25[0-5]|24[0-9]|1\d{2} 或者 25[0-4]|24[0-9]|1\d{2}
- 十位: [1-9]\d{1}
- 个位: 0-9或者1-9
综合起来就是:
(((25[0-5])|(24\d{1})|(1\d{2})|([1-9]\d{1})|([1-9]))(\.((25[0-5])|(24\d{1})|(1\d{2})|([1-9]?\d{1}))){2}\.((25[0-4])|(24\d{1})|(1\d{2})|([1-9]\d{1}))$)
比如说下面的例子,使用上面的正则就可以精准的匹配到IP地址了!
>>> import re
>>> s = '/a/b?ip1=0.1.2.3abvip=222233334444?ip2=255.10.10.255,ip3=10.10.10.255,ip4=10.10.10.254'
>>> p = re.compile(r"(((25[0-5])|(24\d{1})|(1\d{2})|([1-9]\d{1})|([1-9]))(\.((25[0-5])|(24\d{1})|(1\d{2})|([1-9]?\d{1}))){2}\.((25[0-4])|(24\d{1})|(1\d{2})|([1-9]\d{1}))$)")
>>> p.findall(s)[0][0]
'10.10.10.254'
>>>