要使用 Python 驗證 IP 地址,可以使用 ipaddress 模塊的 ip_address() 函數(shù),適用于 IPv4 和 IPv6 地址。還可以使用自定義函數(shù)或正則表達(dá)式來驗證 IP 地址。
驗證字符串中的數(shù)字是否是有效 IP 地址的最簡單方法是使用 ipaddress 模塊。
使用 ipaddress 模塊前請先 pip 安裝。
pip install ipaddress
我們打開 Python shell,使用 ipaddress.ip_address() 函數(shù)。
>>> import ipaddress
>>> ipaddress.ip_address("192.168.1.1")
IPv4Address('192.168.1.1')
ip_address() 函數(shù)返回 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() 函數(shù)會返回 ValueError 異常。
我們可以自定義一個簡單的函數(shù)來判斷 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() 函數(shù)來判斷一個對象是否是一個已知的類型。
自定義函數(shù),通過拆分 IP 地址,并將 IP 地址的每個部分存儲到中。使用 len() 函數(shù)驗證 IP 字符串是否由 4 個數(shù)字組成。對于 IP 中的每組數(shù)字,驗證該數(shù)字是否為整數(shù),檢查數(shù)字是否介于 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
可以使用正則表達(dá)式驗證 IP 地址,以下是使用的匹配模式:
^:表示要匹配的字符串的開頭。
$:表示字符串的末尾。
\d{1,3}:包含 1 到 3 位數(shù)字的整數(shù)。
.:匹配單個點。
完整的 IP 正則匹配規(guī)則:
^\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})$", address)
if bool(match) is False:
print(f"IP 地址無效:{address}")
return False
return True
以上代碼只能驗證 IP 數(shù)字格式,需要結(jié)合前面代碼,驗證每個部分的值是否介于 0 和 255 之間。
import re
def check_ip(address):
match = re.match(r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", 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 類型的簡單方法是使用 ipaddress 模塊。ipaddress.ip_address() 函數(shù)會創(chuàng)建一個對象,使用 isinstance() 函數(shù)來驗證所創(chuàng)建對象的類型。
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 地址。