📜  检查给定的字符串是 IPv4 或 IPv6 还是无效的(1)

📅  最后修改于: 2023-12-03 14:55:50.803000             🧑  作者: Mango

检查给定的字符串是 IPv4 或 IPv6 还是无效的

在网络通讯中使用的 IP 地址可以分为 IPv4 和 IPv6 两种格式。IPv4 使用点分十进制表示法,例如 192.168.0.1;IPv6 使用冒号分隔的十六进制数表示法,例如 2001:0db8:0000:0000:0000:ff00:0042:8329。当我们需要处理 IP 地址时,通常需要先检查给定的字符串是 IPv4、IPv6 还是无效的。

检查 IPv4 地址

我们可以使用正则表达式来判断一个字符串是否符合 IPv4 地址的格式:

import re

def is_ipv4_address(address):
    ip_pattern = re.compile(r'^\d{1,3}(\.\d{1,3}){3}$')
    return bool(ip_pattern.match(address))

上面的代码使用 re.compile() 方法编译了一个正则表达式 r'^\d{1,3}(\.\d{1,3}){3}$',它匹配以一到三个数字开头,然后后面跟着三组一到三个数字加上点号,最后以数字结尾的字符串。这个正则表达式可以检查 IPv4 地址是否符合格式要求。

我们可以调用上述方法来检查一个字符串是否为 IPv4 地址:

print(is_ipv4_address('192.168.0.1'))  # True
print(is_ipv4_address('127.0.0.1'))    # True
print(is_ipv4_address('256.1.1.1'))    # False
print(is_ipv4_address('192.168.0'))    # False
检查 IPv6 地址

IPv6 地址的格式比较复杂,但也可以使用正则表达式进行匹配。下面是一个可以检查 IPv6 地址格式的正则表达式:

import re

def is_ipv6_address(address):
    ip_pattern = re.compile(r'^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$')
    return bool(ip_pattern.match(address))

上面的代码使用了一个比较长的正则表达式 r'^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$' 来匹配 IPv6 地址的格式。它要求地址由八个部分组成,每个部分由一个或多个十六进制数(0 到 F)组成,以冒号分隔。这个正则表达式可以检查 IPv6 地址是否符合格式要求。

我们可以调用上述方法来检查一个字符串是否为 IPv6 地址:

print(is_ipv6_address('2001:0db8:0000:0000:0000:ff00:0042:8329'))  # True
print(is_ipv6_address('2001:db8:0:0:0:ff00:42:8329'))              # True
print(is_ipv6_address('2001:db8::ff00:42:8329'))                   # True
print(is_ipv6_address('2001:0db8:0000:0000:0000:ff00:0042:8329:1')) # False
检查 IP 地址

最后,我们可以将上述方法组合起来,来检查一个字符串是否为 IPv4 或 IPv6 地址:

def is_ip_address(address):
    return is_ipv4_address(address) or is_ipv6_address(address)

上述方法使用了逻辑运算符 or,当 is_ipv4_address()is_ipv6_address() 方法中有一个返回 True 时,就会返回 True。这个方法可以检查字符串是否为 IPv4 或 IPv6 地址。

我们可以调用上述方法来检查一个字符串是否为 IP 地址:

print(is_ip_address('192.168.0.1'))                                # True
print(is_ip_address('2001:0db8:0000:0000:0000:ff00:0042:8329'))    # True
print(is_ip_address('2001:db8::ff00:42:8329'))                     # True
print(is_ip_address('256.1.1.1'))                                   # False
print(is_ip_address('192.168.0'))                                   # False
print(is_ip_address('2001:0db8:0000:0000:0000:ff00:0042:8329:1'))   # False

上述代码可以检查字符串是否为 IPv4 或 IPv6 地址,并输出相应的结果。