使用单个python正则表达式检查主机名和IP地址(v4和v6)?

问题描述:

如果匹配有效的IPv4或IPv6地址,甚至没有特殊字符,但点(。)匹配的主机名,是否可以使用单个正则表达式检查字符串并验证它?使用单个python正则表达式检查主机名和IP地址(v4和v6)?

我对IPv4和IPv6有单独的正则表达式,但是如何将它们合并来完成上述工作?

由于提前,

+1

只是做:'(regexIPv4)|(regexIPv6)' – 2012-04-17 12:42:36

+0

那得是*巨大*正则表达式,至少如果每一个有效的主机名匹配,并拒绝所有的无效之一。 – 2012-04-17 12:42:41

+0

感谢Bart,但主机名呢? – dan 2012-04-17 12:44:31

可以使用一个单一的正则表达式,但它会是丑陋的地狱。无论;

  • 创建单独的正则表达式作为字符串,然后合并它们。更清晰。或者,
  • 分别测试每个正则表达式。也更清晰。

Perl的十岁上下的例子:

if ($foo =~ /$ipv4_re/ or $foo =~ /$ipv6_re/ or $foo =~ /$hostname_re/) { 
    ... 
} 

话虽如此,也有可能是在Python库将验证这些东西对你来说,和我个人宁愿依靠他们。

+0

+1:这个人很有道理。听听他的智慧。 – 2012-04-17 12:49:42

尝试:

(?:\d{1,3}\.){3}\d{1,3}|     (?# IPv4 address) 
[:a-fA-F0-9]*:[:a-fA-F0-9]*:[:a-fA-F0-9.]*| (?# IPv6 address) 
[-a-z0-9A-Z]+\.[-a-z0-9A-Z]*    (?# domain name) 

当然,你可以自由替换与更复杂的个人表达。

(?P<ihost>\\[(?:(?:[0-9A-F]{1,4}:){6}(?:[0-9A-F]{1,4}:[0-9A-F]{1,4}|(?:(?:(?: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]?)))|::(?:[0-9A-F]{1,4}:){5}(?:[0-9A-F]{1,4}:[0-9A-F]{1,4}|(?:(?:(?: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]?)))|[0-9A-F]{1,4}?::(?:[0-9A-F]{1,4}:){4}(?:[0-9A-F]{1,4}:[0-9A-F]{1,4}|(?:(?:(?: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]?)))|(?:(?:[0-9A-F]{1,4}:)?[0-9A-F]{1,4})?::(?:[0-9A-F]{1,4}:){3}(?:[0-9A-F]{1,4}:[0-9A-F]{1,4}|(?:(?:(?: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]?)))|(?:(?:[0-9A-F]{1,4}:){,2}[0-9A-F]{1,4})?::(?:[0-9A-F]{1,4}:){2}(?:[0-9A-F]{1,4}:[0-9A-F]{1,4}|(?:(?:(?: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]?)))|(?:(?:[0-9A-F]{1,4}:){,3}[0-9A-F]{1,4})?::(?:[0-9A-F]{1,4}:)(?:[0-9A-F]{1,4}:[0-9A-F]{1,4}|(?:(?:(?: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]?)))|(?:(?:[0-9A-F]{1,4}:){,4}[0-9A-F]{1,4})?::(?:[0-9A-F]{1,4}:[0-9A-F]{1,4}|(?:(?:(?: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]?)))|(?:(?:[0-9A-F]{1,4}:){,5}[0-9A-F]{1,4})?::[0-9A-F]{1,4}|(?:(?:[0-9A-F]{1,4}:){,6}[0-9A-F]{1,4})?::|v[0-9A-F]+\\.(?:[a-zA-Z0-9_.~-]|[!$&'()*+,;=]|:)+)\\]|(?:(?:(?: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]?))|(?:(?:[a-zA-Z0-9._~-]|[\xa0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef\U00010000-\U0001fffd\U00020000-\U0002fffd\U00030000-\U0003fffd\U00040000-\U0004fffd\U00050000-\U0005fffd\U00060000-\U0006fffd\U00070000-\U0007fffd\U00080000-\U0008fffd\U00090000-\U0009fffd\U000a0000-\U000afffd\U000b0000-\U000bfffd\U000c0000-\U000cfffd\U000d0000-\U000dfffd\U000e1000-\U000efffd])|%[0-9A-F][0-9A-F]|[!$&'()*+,;=])*) 

(从rfc3987