Python 中验证 IP 地址


假设我们有一个字符串;我们需要检查给定的输入是有效的 IPv4 地址、IPv6 地址还是两者都不是。

IPv4 地址以点分十进制表示法规范表示,它由四个十进制数字组成,每个数字的范围从 0 到 255,并用点 (“.”) 分隔。例如,192.168.254.1;此外,IPv4 地址中的前导零无效。例如,地址 192.168.254.01 无效。

IPv6 地址表示为八组四个十六进制数字,每组代表 16 位。这些组用冒号 (":") 分隔。例如,假设地址 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效地址。此外,我们可以在四个十六进制数字中省略一些前导零,并将地址中的一些小写字符转换为大写字符,因此 2001:db8:85a3:0:0:8A2E:0370:7334 这个地址也是有效的。

但是,为了追求简单,我们不会用两个连续的冒号 (::) 将连续的零值组替换为单个空组。因此,例如,2001:0db8:85a3::8A2E:0370:7334 是一个无效的 IPv6 地址。此外,IPv6 中的多余前导零也是无效的。地址 02001:0db8:85a3:0000:0000:8a2e:0370:7334 无效。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个方法 checkv4(x),它将检查 x 是否在 0 到 255 的范围内,如果是,则返回 true,否则返回 false。

  • 定义一个方法 checkv6(x),它将按如下方式工作:

    • 如果 x 的大小大于 4,则返回 false。

    • 如果 x 的十进制等价物大于等于 0 且 x[0] 不是 ‘-’,则返回 true,否则返回 false。

  • 从主方法开始

  • 如果输入有三个点,并且对于每个部分,checkv4(i) 都为 true,则返回“IPv4”。

  • 如果输入有七个冒号,并且对于每个部分,checkv6(i) 都为 true,则返回“IPv6”。

示例(Python)

让我们看看以下实现,以便更好地理解:

 在线演示

class Solution(object):
   def validIPAddress(self, IP):
      """
      :type IP: str
      :rtype: str
      """
      def isIPv4(s):
         try: return str(int(s)) == s and 0 <= int(s) <= 255
         except: return False
      def isIPv6(s):
         if len(s) > 4:
            return False
         try : return int(s, 16) >= 0 and s[0] != '-'
         except:
            return False
      if IP.count(".") == 3 and all(isIPv4(i) for i in IP.split(".")):
         return "IPv4"
      if IP.count(":") == 7 and all(isIPv6(i) for i in IP.split(":")):
         return "IPv6"
      return "Neither"
ob = Solution()
print(ob.validIPAddress("172.16.254.1"))

输入

"172.16.254.1"

Learn Python in-depth with real-world projects through our Python certification course. Enroll and become a certified expert to boost your career.

输出

"IPv4"

更新于: 2020 年 4 月 29 日

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告