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"

輸出

"IPv4"

更新於: 2020 年 4 月 29 日

2K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告