2017-01-06 2 views
4

내 파이썬 응용 프로그램에서의 범위에있는 경우 I는 다음과 같이 보이는 IP 주소 문자열 배열이 체크 : 나는 netaddr를 설치파이썬 - 사용자의 IP 주소가 IP의

[ 
    "50.28.85.81-140", // Matches any IP address that matches the first 3 octets, and has its final octet somewhere between 81 and 140 
    "26.83.152.12-194" // Same idea: 26.83.152.12 would match, 26.83.152.120 would match, 26.83.152.195 would not match 
] 

및 문서가 큰 보이지만을 , 나는 그것의 주위에 나의 머리를 감쌀 수 없다. 이것은 정말 간단해야합니다 - 주어진 IP 주소가이 범위 중 하나와 일치하는지 어떻게 확인합니까? 특별히 netaddr을 사용할 필요가 없습니다. 간단한 파이썬 솔루션으로도 가능합니다.

+0

가능한 복제 ([의 IP 파이썬에서 네트워크에있는 경우 내가 확인할 수있는 방법] http://stackoverflow.com/questions/819355/how-can-i-check-if-an-ip -is-in-a-in-a-python) – MooingRawr

+0

또한 동일한 dup 링크에서 온 것입니다. http://stackoverflow.com/a/820124/4099813 – MooingRawr

+0

형식은 동일하지 않습니다. – Faibbus

답변

4

아이디어는 SP 것입니다 IP를 켜고 모든 구성 요소를 개별적으로 점검하십시오.

mask = "26.83.152.12-192" 
IP = "26.83.152.19" 
def match(mask, IP): 
    splitted_IP = IP.split('.') 
    for index, current_range in enumerate(mask.split('.')): 
     if '-' in current_range: 
     mini, maxi = map(int,current_range.split('-')) 
     else: 
     mini = maxi = int(current_range) 
     if not (mini <= int(splitted_IP[index]) <= maxi): 
     return False 
    return True 
3

이것이 최선이라고 확신하지는 않지만 기본 Python이므로 추가 패키지가 필요하지 않습니다.

  • 간단한 값인 경우 요소가 1이고 범위이면 range 인 목록을 생성합니다. 그래서 그것은 4 개의 int/range 객체리스트를 생성합니다.
  • 다음 zip를 주소의 split 버전과 다른

주의 범위에서 각 값을 테스트 : range를 사용하여 (파이썬 3) 초고속 in 테스트를 보장 (Why is "1000000000000000 in range(1000000000000001)" so fast in Python 3?)

ip_range = "50.28.85.81-140" 

toks = [[int(d)] if d.isdigit() else range(int(d.split("-")[0]),int(d.split("-")[1]+1)) for d in ip_range.split(".")] 

print(toks) # debug 

for test_ip in ("50.28.85.86","50.284.85.200","1.2.3.4"): 
    print (all(int(a) in b for a,b in zip(test_ip.split("."),toks))) 
(예상대로)

결과 :

[[50], [28], [85], range(81, 140)] 
True 
False 
False