匹配 IPv4 的正则表达式如下:
import re
ipv4_regex = r'^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$'
# 测试
ip_list = ['192.168.1.1', '10.0.0.1', '172.16.31.255', '300.100.200.50', '192..1']
for ip in ip_list:
if re.match(ipv4_regex, ip):
print(f'{ip} 是合法的 IPv4 地址')
else:
print(f'{ip} 不是合法的 IPv4 地址')
匹配 IPv6 的正则表达式如下:
import re
ipv6_regex = r'^(([a-fA-F0-9]{1,4}:){7}[a-fA-F0-9]{1,4}|([a-fA-F0-9]{1,4}:){6}:([a-fA-F0-9]{1,4}:){1,3}|([a-fA-F0-9]{1,4}:){5}:([a-fA-F0-9]{1,4}:){1,4}|([a-fA-F0-9]{1,4}:){4}:([a-fA-F0-9]{1,4}:){1,5}|([a-fA-F0-9]{1,4}:){3}:([a-fA-F0-9]{1,4}:){1,6}|([a-fA-F0-9]{1,4}:){2}:([a-fA-F0-9]{1,4}:){1,7}|[a-fA-F0-9]{1,4}:((:[a-fA-F0-9]{1,4}){1,7}|:)|:((:[a-fA-F0-9]{1,4}){1,7}|:))%?(\d{1,3})?$'
# 测试
ip_list = ['2001:db8:85a3::8a2e:370:7334', '2002:c0a8:101::42', '20010db885a3000000008a2e03707334', '::ffff:c000:280', '::']
for ip in ip_list:
if re.match(ipv6_regex, ip):
print(f'{ip} 是合法的 IPv6 地址')
else:
print(f'{ip} 不是合法的 IPv6 地址')
其中,ipv6_regex 的正则表达式中有一些比较复杂的部分,需要进行解释:
([a-fA-F0-9]{1,4}:){n}
表示匹配 n 个长度为 1 到 4 的十六进制数,以 : 分隔。[a-fA-F0-9]{1,4}:$
表示匹配一个长度为 1 到 4 的十六进制数,以 : 结尾。|
表示或者。([a-fA-F0-9]{1,4}:){m,n}
表示匹配 m 到 n 个长度为 1 到 4 的十六进制数,以 : 分隔。:
表示匹配一个冒号。(:(?:[a-fA-F0-9]{1,4})){0,7}
表示匹配最多 7 个长度为 1 到 4 的十六进制数,以 : 分隔。注意到这里的 ?: 是用来指定一个非捕获组,表示只匹配但不保存匹配结果。%?(\d{1,3})?$
表示匹配可选的网络接口标识符(以 % 开头),后面紧跟着一个数字。