正則精準匹配IP的問題
阿新 • • 發佈:2019-01-01
經常會碰到匹配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' >>>