2012-06-29 35 views
12

Tôi đang cố gắng để thực hiện một thử nghiệm để kiểm tra xem một đầu vào sys.argv phù hợp với RegEx cho một địa chỉ IP ...Sử dụng một RegEx để phù hợp với địa chỉ IP bằng Python

Là một thử nghiệm đơn giản, tôi có sau ...

import re 

pat = re.compile("\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}") 
test = pat.match(hostIP) 
if test: 
    print "Acceptable ip address" 
else: 
    print "Unacceptable ip address" 

Tuy nhiên khi tôi vượt qua các giá trị ngẫu nhiên vào nó, nó sẽ trả về "địa chỉ IP thể chấp nhận được" trong hầu hết các trường hợp, trừ khi tôi có một "địa chỉ" có nghĩa là về cơ bản tương đương với \d+.

+0

Bạn có sẵn sàng chấp nhận 999.999.999.999 là địa chỉ IP "hợp lệ" không? :) –

+0

Chỉ IPv4; không có IPv6? – belacqua

+0

Xem http://stackoverflow.com/questions/319279/how-to-validate-ip-address-in-python?lq=1 và http://stackoverflow.com/questions/10191442/check-hostnames-and- ip-addresses-v4-và-v6-sử dụng-một-đơn-python-regex? rq = 1 – belacqua

Trả lời

18

Bạn phải thay đổi regex của bạn theo cách sau

pat = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") 

đó là bởi vì . là một ký tự đại diện mà là viết tắt của "mỗi nhân vật"

+0

Ngoài ra để đảm bảo chuỗi được cung cấp chính xác, bạn có thể thêm '^' để bắt đầu và '$' để kết thúc . Nếu không, nó có thể khớp với một chuỗi như '10.0.0.1: 1234', nơi bạn không muốn nó. – javex

+0

@javex bạn đang phải – DonCallisto

+0

OMG ... FFS !!! một lỗi "trường học-cậu bé" ... Tôi đã thực sự giúp đỡ một người nào đó ngày khác với regex và "." ... GHHHH! ... Tôi đã được đặt trên nó là một vấn đề python! Cảm ơn rất nhiều – MHibbin

2

Bạn đang cố gắng sử dụng. như một . không phải là ký tự đại diện cho bất kỳ ký tự nào. Sử dụng \. để thay thế một khoảng thời gian.

27

Sử dụng regex để xác nhận địa chỉ IP là một ý tưởng tồi - đây sẽ vượt qua 999.999.999.999 là hợp lệ. Hãy thử phương pháp này bằng cách sử dụng socket thay thế - xác thực tốt hơn nhiều và dễ dàng như vậy, nếu không dễ dàng hơn để thực hiện.

import socket 

def valid_ip(address): 
    try: 
     socket.inet_aton(address) 
     return True 
    except: 
     return False 

print valid_ip('10.10.20.30') 
print valid_ip('999.10.20.30') 
print valid_ip('gibberish') 

Nếu bạn thực sự muốn sử dụng phương pháp phân tích cú pháp-the-host thay vào đó, mã này sẽ làm điều đó một cách chính xác:

def valid_ip(address): 
    try: 
     host_bytes = address.split('.') 
     valid = [int(b) for b in host_bytes] 
     valid = [b for b in valid if b >= 0 and b<=255] 
     return len(host_bytes) == 4 and len(valid) == 4 
    except: 
     return False 
+5

Regex có thể hoạt động, nhưng cách tiếp cận của bạn tốt hơn. – belacqua

+0

Có ... bạn có thể viết một regex khủng khiếp mà phù hợp với "0" đến "255" nhưng nó có lẽ tốt hơn để tránh nó :) –

+1

+1 từ tôi quá cho phương pháp này (upvoted một giờ trước đây hay như vậy :) – Levon

9

regex cho ip v4:

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ 

nếu không bạn mất địa chỉ ip không hợp lệ như 999.999.999.999, 256.0.0.0 v.v.

+0

wow!Tôi nghĩ rằng tôi sẽ gắn bó với phương pháp ổ cắm, cảm ơn mặc dù .. Tôi sẽ thực sự lưu ý về điều này ... Tôi đã tự hỏi nó sẽ như thế nào. :-) – MHibbin

+0

Tuyệt. Nếu không sử dụng Python nhưng PRCE có thể ngắn hơn một chút khi sử dụng các chương trình con: '^ ((25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] { 1,2}) \.) {3} (? 2) $ ' https://regex101.com/r/sE3hK5/1 –

-1

Địa chỉ IP sử dụng xác thực sau:

  1. 255 ---> 250-255
  2. 249 ---> 200-249
  3. 199 ---> 100-199
  4. 99 ---> 10-99
  5. 9 ---> 1-9

    import re  
    k = 0 
    while k < 5 : 
        i = input("\nEnter Ip address : ") 
        ip = re.match("^([1][0-9][0-9].|^[2][5][0-5].|^[2][0-4][0-9].|^[1][0-9][0-9].|^[0-9][0-9].|^[0-9].)([1][0-9][0-9].|[2][5][0-5].|[2][0-4][0-9].|[1][0-9][0-9].|[0-9][0-9].|[0-9].)([1][0-9][0-9].|[2][5][0-5].|[2][0-4][0-9].|[1][0-9][0-9].|[0-9][0-9].|[0-9].)([1][0-9][0-9]|[2][5][0-5]|[2][0-4][0-9]|[1][0-9][0-9]|[0-9][0-9]|[0-9])$",i) 
        k = k + 1 
        if ip: 
         print ("\n=====================") 
         print ("Valid IP address") 
         print ("=====================") 
         break 
        else : 
         print ("\nInvalid IP") 
    else : 
        print ("\nAllowed Max 5 times") 
    

Trả lời tôi nếu bạn có nghi ngờ gì nữa?

-4
yourip = '10.10.10.10' 

if [0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',yourip).group(0))].count(True)==4: 

    print "valid ip" 

else: 

    print "invalid ip" 
+1

Vì vậy, ngoài thực tế là' your-ip' không thực sự là biến hợp lệ tên, tôi phải nói rằng đây là một cách sử dụng khá lạ và mơ hồ của các từ "hiệu quả" và "đơn giản" mà trước đây tôi chưa từng biết đến. – Carpetsmoker

+0

Tôi vừa đề cập đến biến 'your-ip' của bạn để dễ đọc và không xem xét hoặc sao chép dán nó. tôi đã đề cập từ "đơn giản" và "hiệu quả" bởi vì bạn không phải viết regex dài để xác thực một ip. Tôi đã sử dụng danh sách hiểu và re.split mà làm cho nó đơn giản. bạn có thể hiểu bằng cách xem điều kiện if. – Ranga

1
def ipcheck(): 
# 1.Validate the ip adderess 
input_ip = input('Enter the ip:') 
flag = 0 

pattern = "^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$" 
match = re.match(pattern, input_ip) 
if (match): 
    field = input_ip.split(".") 
    for i in range(0, len(field)): 
     if (int(field[i]) < 256): 
      flag += 1 
     else: 
      flag = 0 
if (flag == 4): 
    print("valid ip") 
else: 
    print('No match for ip or not a valid ip') 
0

Dưới đây là một IPv4/6 biến thể phù hợp cho điều tương tự:

địa chỉ
pattern = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\.\d{1,3}\.\d{1,3})?$") 

này sẽ phù hợp với cả IPv4 và IPv6. Thay đổi này là (\.\d{1,3}\.\d{1,3})? và sẽ khớp với những thay đổi đó .xx.xx nếu có.

-1
import re 

st1 = 'This is my IP Address10.123.56.25 789.356.441.561 127 255 123.55 192.168.1.2.3 192.168.2.2 str1' 

đây của tôi có giá trị địa chỉ IP duy nhất 192.168.2.2 và giả định 10.123.56.25 là được không phải là một giá trị như nó được kết hợp với một số chuỗi và 192.168.1.2.3 không hợp lệ.

pat = r'\s(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\s|$))' 

match = re.search(pat,st1) 

print match.group() 

================ RESTART: C:/Python27/Srujan/re_practice.py ================ 
192.168.2.2 

Điều này sẽ grep chính xác Địa chỉ IP, chúng tôi có thể bỏ qua bất kỳ mẫu nào giống như Địa chỉ IP nhưng không hợp lệ. Ví dụ: 'Address10.123.56.25', '789.356.441.561' '192.168.1.2.3'.

Vui lòng nhận xét nếu có bất kỳ sửa đổi nào được yêu cầu.

-1

này làm việc cho python 2.7:

import re 
a=raw_input("Enter a valid IP_Address:") 
b=("[0-9]+"+".")+"{3}" 
if re.match(b,a) and b<255: 
    print "Valid" 
else: 
    print "invalid" 
3

Tôi đã xem qua tình cảnh tương tự, tôi thấy câu trả lời với việc sử dụng thư viện socket hữu ích nhưng nó không cung cấp hỗ trợ cho các địa chỉ ipv6. Tìm thấy một cách tốt hơn cho nó:

Đáng tiếc là nó Làm việc cho python3 chỉ

import ipaddress 

def valid_ip(address): 
    try: 
     print ipaddress.ip_address(address) 
     return True 
    except: 
     return False 

print valid_ip('10.10.20.30') 
print valid_ip('2001:DB8::1') 
print valid_ip('gibberish') 
+0

Điều này sẽ trả về 0.0.0.0 cũng –

+1

@rakeshpatanga, vâng, đó là địa chỉ IP hợp lệ. – Deepak

0
import re 
ipv=raw_input("Enter an ip address") 
a=ipv.split('.') 
s=str(bin(int(a[0]))+bin(int(a[1]))+bin(int(a[2]))+bin(int(a[3]))) 
s=s.replace("0b",".") 
m=re.search('\.[0,1]{1,8}\.[0,1]{1,8}\.[0,1]{1,8}\.[0,1]{1,8}$',s) 
if m is not None: 
    print "Valid sequence of input" 
else : 
    print "Invalid input sequence" 

Chỉ cần để giữ cho nó đơn giản, tôi đã sử dụng phương pháp này. Đơn giản như để giải thích địa chỉ ipv4 thực sự được đánh giá như thế nào. Kiểm tra xem số nhị phân của nó là mặc dù không bắt buộc. Hy vọng bạn thích điều này.

Các vấn đề liên quan