2012-06-29 36 views
12

que estoy tratando de hacer una prueba para comprobar si una entrada sys.argv coincide con la expresión regular para una dirección IP ...El uso de una expresión regular para que coincida con las direcciones IP en Python

Como una prueba simple, tengo el siguiente ...

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" 

Sin embargo cuando pase valores aleatorios en él, devuelve "dirección IP aceptable" en la mayoría de los casos, excepto cuando tenga una "dirección" que es básicamente equivalente a \d+.

+0

¿Está dispuesto a aceptar el 999.999.999.999 como dirección IP "válida"? :) –

+0

IPv4 solamente; no IPv6? – belacqua

+0

Ver http://stackoverflow.com/questions/319279/how-to-validate-ip-address-in-python?lq=1 y http://stackoverflow.com/questions/10191442/check-hostnames-and- ip-addresses-v4-and-v6-using-a-single-python-regex? rq = 1 – belacqua

Respuesta

18

tiene que modificar su expresión regular de la siguiente manera

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

eso es porque . es un comodín que significa "todos los personajes"

+0

También para asegurarse de que la cadena es exactamente como se proporciona, puede agregar '^' para comenzar y '$' para el final . De lo contrario, es posible que coincida con una cadena como '10.0.0.1: 1234' donde no la quiere. – javex

+0

@javex tienes razón – DonCallisto

+0

OMG ... FFS !!! un "error escolar" ... en realidad estaba ayudando a alguien el otro día con expresiones regulares y "." ... GHHHH! ... ¡Fui una cuestión de pitón! Muchas gracias – MHibbin

2

Está tratando de usar. como un . no como el comodín de ningún personaje. Use \. para indicar un punto.

27

El uso de expresiones regulares para validar la dirección IP es una mala idea - este pasará el 999.999.999.999 como válido. Pruebe este enfoque usando socket en su lugar - una validación mucho mejor y tan fácil, si no más fácil de hacer.

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') 

Si realmente desea utilizar el enfoque de análisis sintáctico-la-host en lugar, este código hará exactamente:

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 puede funcionar, pero su enfoque es mejor. – belacqua

+0

Sí ... podrías escribir una expresión horrible que coincida con "0" a "255", pero probablemente sea mejor evitarla :) –

+1

+1 de mí también para este enfoque (hace una hora o más atrás) – Levon

9

expresiones regulares para 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]?)$ 

si no usted toma dirección IP no válida como 999.999.999.999, 256.0.0.0 etc.

+0

¡guau!Creo que me quedaré con el método de los sockets, gracias. De hecho tomaré nota de esto ... Me preguntaba cómo sería. :-) – MHibbin

+0

Cool. Si no se utiliza en Python, pero PRCE puede ser un poco más corto usando subrutinas: '^ ((25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] { 1,2}) \.) {3} (? 2) $ ' https://regex101.com/r/sE3hK5/1 –

-1

La dirección IP utiliza la siguiente autenticación:

  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") 
    

me responda si tiene dudas?

-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

Así que aparte del hecho de que' your-ip' no es realmente una variable válida nombre, debo decir que este es un uso bastante extraño y oscuro de las palabras "efectivo" y "simple" que no conocía anteriormente. – Carpetsmoker

+0

Acabo de mencionar la variable 'your-ip' para legibilidad y no considerar o copiar pegarlo. Mencioné las palabras "simple" y "efectivo" porque no tiene que escribir una expresión regular larga para validar una IP. He usado la lista de comprensión y re.split que lo hizo simple. puedes entender al ver la condició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

Aquí es una variante compatible con IPv4/6 para lo mismo:

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

Este igualaremos direcciones IPv4 e IPv6. El cambio es (\.\d{1,3}\.\d{1,3})? y coincidirá con los .xx.xx adicionales si están presentes.

-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' 

Aquí mi dirección IP válida sólo 192.168.2.2 y asumiendo 10.123.56.25 no es válida, ya que se combina con un trozo de cuerda y 192.168.1.2.3 no es válido.

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 

Esto grep la dirección IP exacta, podemos ignorar cualquier patrón parece una dirección IP pero no es válida. Ej: 'Address10.123.56.25', '789.356.441.561' '192.168.1.2.3'.

Comente si se requieren modificaciones.

-1

Esto funciona para 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

yo nos encontramos con la misma situación, he encontrado la respuesta con el uso de la biblioteca de sockets útiles pero no proporciona soporte para direcciones IPv6. Encontrado una forma mejor para él:

Desafortunadamente funciona para python3 única

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

Esto devolverá 0.0.0.0 también –

+1

@rakeshpatanga, sí, es una dirección IP válida. – 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" 

Sólo para que sea sencillo He utilizado este enfoque. Simple como en para explicar cómo realmente se evalúa la dirección ipv4. Verificando si es un número binario aunque no es obligatorio. Espero les guste esto.

Cuestiones relacionadas