正则表达式检查IP是否有效

时间:2010-10-25 04:10:24

标签: python regex

我想知道是否可以将regexp中的值与Python中的regexp系统进行比较。匹配IP的模式很容易,但每个1-3位数不能超过255,这就是我有点难过的地方。

8 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:6)

您可以轻松检查4个八位字节的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
>>>

答案 3 :(得分:3)

正则表达式用于模式匹配,但要检查有效的IP,您需要检查范围(即0 <= n <= 255)。

您可以使用正则表达式检查范围,但这有点矫枉过正。我认为你最好检查基本模式,然后检查每个数字的范围。

例如,使用以下模式匹配IP:

([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})

然后检查每个数字是否在范围内。

答案 4 :(得分:3)

以下支持IPv4,IPv6以及Python 2.7&amp; 3.3

import socket


def is_valid_ipv4(ip_str):
    """
    Check the validity of an IPv4 address
    """
    try:
        socket.inet_pton(socket.AF_INET, ip_str)
    except AttributeError:
        try:
            socket.inet_aton(ip_str)
        except socket.error:
            return False
        return ip_str.count('.') == 3
    except socket.error:
        return False
    return True


def is_valid_ipv6(ip_str):
    """
    Check the validity of an IPv6 address
    """
    try:
        socket.inet_pton(socket.AF_INET6, ip_str)
    except socket.error:
        return False
    return True


def is_valid_ip(ip_str):
    """
    Check the validity of an IP address
    """
    return is_valid_ipv4(ip_str) or is_valid_ipv6(ip_str)

答案 5 :(得分:0)

也可以使用拆分检查IP地址,如下所示,

all(map((lambda x: 0<=x<=255),map(int,ip.split('.')))) and len(ip.split("."))==4

对我来说,这比正则表达式更具可读性。

答案 6 :(得分:0)

我认为人们这样做太过分了,我建议你先这样做: ips = re.findall('(?:[\ d] {1,3})。(?:[\ d] {1,3})。(?:[\ d] {1,3})。( ?:[\ d] {1,3})',页面) 然后拆分4个数字,其中有一个'。'并检查它们是否小于256

答案 7 :(得分:0)

你需要这个 -

^((([1-9])|(0[1-9])|(0[0-9][1-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))\.){3}(([1-9])|(0[1-9])|(0[0-9][1-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))$

Regular expression visualization

Debuggex Demo