1. 程式人生 > >正則精準匹配IP的問題

正則精準匹配IP的問題

經常會碰到匹配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'
>>>