检查IP有效性的正则表达式
我在想,能不能在Python的正则表达式中比较值。匹配IP地址的格式很简单,但每个1到3位的数字不能超过255,这让我有点困惑。
8 个回答
6
你可以很简单地检查一个四段式的IP地址,根本不需要用到正则表达式。下面是一个经过测试的有效方法:
>>> def valid_ip(ip):
... parts = ip.split('.')
... return (
... len(parts) == 4
... and all(part.isdigit() for part in parts)
... and all(0 <= int(part) <= 255 for part in parts)
... )
...
>>> valid_ip('1.2.3.4')
True
>>> valid_ip('1.2.3.4.5')
False
>>> valid_ip('1.2. 3 .4.5')
False
>>> valid_ip('1.256.3.4.5')
False
>>> valid_ip('1.B.3.4')
False
>>>
9
这里不需要用到正则表达式。先给你一些背景知识:
>>> import socket
>>> socket.inet_aton('255.255.255.255')
'\xff\xff\xff\xff'
>>> socket.inet_aton('255.255.255.256')
Traceback (most recent call last):
File "<input>", line 1, in <module>
error: illegal IP address string passed to inet_aton
>>> socket.inet_aton('my name is nobody')
Traceback (most recent call last):
File "<input>", line 1, in <module>
error: illegal IP address string passed to inet_aton
那么:
import socket
def ip_address_is_valid(address):
try: socket.inet_aton(address)
except socket.error: return False
else: return True
注意,像 '127.1' 这样的地址在你的机器上可能是可以接受的(有些系统,比如 MS Windows 和 Linux,会把缺少的部分当作零来处理,所以 '127.1' 实际上等同于 '127.0.0.1',而 '10.1.4' 则等同于 '10.1.0.4')。如果你希望地址总是有4个部分,可以把最后一行改成:
else: return True
变成:
else: return address.count('.') == 3
6
你需要检查每个位置上允许的数字。对于第一个可选的数字,允许的值是0到2。第二个数字的范围是0到5(如果第一个数字存在的话,否则是0到9),第三个数字的范围是0到9。
我在这个网站上找到了一个带注释的例子:http://www.regular-expressions.info/regexbuddy/ipaccurate.html:
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b