Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 IP 주소 확인


문자열이 있다고 가정합니다. 주어진 입력이 유효한 IPv4 주소인지 IPv6 주소인지 또는 둘 다인지 확인해야 합니다.

IPv4 주소는 표준적으로 점으로 구분된 10진수 표기법으로 표시되며, 각각의 범위는 0에서 255까지이며 점(".")으로 구분된 4개의 10진수로 구성됩니다(예:192.168.254.1; 게다가 IPv4 주소의 선행 0은 유효하지 않습니다. 예를 들어, 주소 192.168.254.01은 유효하지 않습니다.

IPv6 주소는 4개의 16진수로 구성된 8개의 그룹으로 표시되며 각 그룹은 16비트를 나타냅니다. 그룹은 콜론(":")으로 구분됩니다. 예를 들어 주소가 2001:0db8:85a3:0000:0000:8a2e:0370:7334인 경우 유효한 주소입니다. 또한 4개의 16진수 숫자 중 일부 선행 0과 주소의 일부 소문자를 대문자로 생략할 수 있으므로 2001:db8:85a3:0:0:8A2E:0370:7334 이 주소도 유효합니다. /P>

그러나 단순성을 추구하기 위해 두 개의 연속적인 콜론(::)을 사용하여 값이 0인 연속적인 그룹을 하나의 빈 그룹으로 바꾸지 않습니다. 예를 들어 2001:0db8:85a3::8A2E:0370:7334는 잘못된 IPv6 주소입니다. 게다가 IPv6의 추가 선행 0도 유효하지 않습니다. 02001:0db8:85a3:0000:0000:8a2e:0370:7334 주소가 잘못되었습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • checkv4(x) 메서드를 정의하면 x가 0에서 255 사이의 범위에 있는지 확인한 다음 true, 그렇지 않으면 false

  • checkv6(x) 메서드를 정의하면 다음과 같이 작동합니다. -

    • 크기가 x> 4이면 false를 반환합니다.

    • x>=0 및 x[0]에 해당하는 10진수가 '-'가 아니면 true를 반환하고 그렇지 않으면 false를 반환합니다.

  • 주요 방법에서

  • 입력에 3개의 점이 있고 각 부분에 대해 checkv4(i)가 true이면 "IPv4"를 반환합니다.

  • 입력에 7개의 콜론이 있고 각 부분에 대해 I checkv6(i)이 true이면 "IPv6"을 반환합니다.

예제(파이썬)

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

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"