Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ตรวจสอบที่อยู่ IP ใน Python


สมมติว่าเรามีสตริง เราต้องตรวจสอบว่าข้อมูลที่ป้อนนั้นเป็นที่อยู่ 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 หรือไม่ จากนั้นเป็นจริง มิฉะนั้นจะเป็นเท็จ

  • กำหนดวิธีการ checkv6(x) ซึ่งจะทำงานดังนี้ -

    • ถ้าขนาด x> 4 ให้คืนค่าเท็จ

    • หากค่าทศนิยมของ x>=0 และ x[0] ไม่ใช่ '-' ให้คืนค่า จริง มิฉะนั้น เท็จ

  • จากวิธีหลัก

  • หากอินพุตมีสามจุด และสำหรับแต่ละส่วน ฉัน checkv4(i) เป็นจริง จากนั้นส่งคืน “IPv4”

  • หากอินพุตมีโคลอนเจ็ดตัว และสำหรับแต่ละส่วน ฉัน checkv6(i) เป็นจริง จากนั้นส่งคืน “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"