检查IP有效性的正则表达式

3 投票
8 回答
6246 浏览
提问于 2025-04-16 06:02

我在想,能不能在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

撰写回答