要使用 Python 验证 IP 地址,可以使用 ipaddress 模块的 ip_address() 函数,适用于 IPv4 和 IPv6 地址。还可以使用自定义函数或正则表达式来验证 IP 地址。
使用 ipaddress 模块验证 IP 地址
验证字符串中的数字是否是有效 IP 地址的最简单方法是使用 ipaddress 模块。
使用 ipaddress 模块前请先 pip 安装。
pip install ipaddress
我们打开 Python shell,使用 ipaddress.ip_address() 函数。
>>> import ipaddress
>>> ipaddress.ip_address("192.168.1.1")
IPv4Address('192.168.1.1')
ip_address() 函数返回 IPv4Address 类型的对象,这意味着字符串中包含有效的 IP 地址。
>>> import ipaddress
>>> ipaddress.ip_address("192.168.1.300")
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
File "D:\thonny\lib\ipaddress.py", line 54, in ip_address
ValueError: '192.168.1.300' does not appear to be an IPv4 or IPv6 address
如果字符串中包含无效的 IP 地址,ip_address() 函数会返回 ValueError 异常。
我们可以自定义一个简单的函数来判断 IP 地址是否有效。
import ipaddress
def check_ip(address):
try:
ip = ipaddress.ip_address(address)
print(f"IP 地址有效:{ip}")
except ValueError:
print(f"IP 地址无效:{address}")
check_ip("172.18.1.1")
check_ip("192.168.100.100")
check_ip("192.168.1.300")
# 输出:
IP 地址有效:172.18.1.1
IP 地址有效:192.168.100.100
IP 地址无效:192.168.1.300
isinstance() 函数来判断一个对象是否是一个已知的类型。
自定义函数验证 IP 地址
自定义函数,通过拆分 IP 地址,并将 IP 地址的每个部分存储到中。使用 len() 函数验证 IP 字符串是否由 4 个数字组成。对于 IP 中的每组数字,验证该数字是否为整数,检查数字是否介于 0 和 255 之间。
def check_ip(address):
ip_list = address.split(".")
if len(ip_list) != 4:
print(f"IP 地址无效:{address}")
return False
for i in ip_list:
if not isinstance(int(i), int):
print(f"IP 地址无效:{address}")
return False
if int(i) < 0 or int(i) > 255:
print(f"IP 地址无效:{address}")
return False
print(f"IP 地址有效:{address}")
return True
check_ip("172.18.1.1")
check_ip("192.168.100.100")
check_ip("192.168.1.300")
# 输出:
IP 地址有效:172.18.1.1
IP 地址有效:192.168.100.100
IP 地址无效:192.168.1.300
使用正则表达式验证 IP 地址
可以使用正则表达式验证 IP 地址,以下是使用的匹配模式:
^:表示要匹配的字符串的开头。
$:表示字符串的末尾。
\d{1,3}:包含 1 到 3 位数字的整数。
.:匹配单个点。
完整的 IP 正则匹配规则:
^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
import re
def check_ip(address):
match = re.match(r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})#34;, address)
if bool(match) is False:
print(f"IP 地址无效:{address}")
return False
return True
以上代码只能验证 IP 数字格式,需要结合前面代码,验证每个部分的值是否介于 0 和 255 之间。
import re
def check_ip(address):
match = re.match(r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})#34;, address)
if bool(match) is False:
print(f"IP 地址无效:{address}")
return False
ip_list = address.split(".")
for i in ip_list:
if int(i) < 0 or int(i) > 255:
print(f"IP 地址无效:{address}")
return False
print(f"IP 地址有效:{address}")
return True
check_ip("172.18.1.1")
check_ip("192.168.100.100")
check_ip("192.168.1.300")
# 输出:
IP 地址有效:172.18.1.1
IP 地址有效:192.168.100.100
IP 地址无效:192.168.1.300
检查 IP 的类型是 IPv4 还是 IPv6
检查 IP 是 IPv4 还是 IPv6 类型的简单方法是使用 ipaddress 模块。ipaddress.ip_address() 函数会创建一个对象,使用 isinstance() 函数来验证所创建对象的类型。
import ipaddress
def check_ip(address):
try:
ip = ipaddress.ip_address(address)
if isinstance(ip, ipaddress.IPv4Address):
print(f"{address} 是 IPv4 地址。")
elif isinstance(ip, ipaddress.IPv6Address):
print(f"{address} 是 IPv6 地址。")
except ValueError:
print(f"{address} 不是有效 IP 地址。")
check_ip("172.18.1.1")
check_ip("192.168.100.100")
check_ip("192.168.1.300")
check_ip("CDCD:910A:2222:5498:8475:1111:3900:2020")
# 输出:
172.18.1.1 是 IPv4 地址。
192.168.100.100 是 IPv4 地址。
192.168.1.300 不是有效 IP 地址。
CDCD:910A:2222:5498:8475:1111:3900:2020 是 IPv6 地址。
?
文章创作不易,如果您喜欢这篇文章,请关注、点赞并分享给朋友。如有意见和建议,请在评论中反馈!
?