Usando un RegEx para hacer coincidir las direcciones IP en Python

Estoy tratando de hacer una prueba para verificar si una entrada sys.argv coincide con el RegEx para una dirección IP …

Como una simple prueba, tengo los siguientes …

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 le paso valores aleatorios, devuelve “Dirección IP aceptable” en la mayoría de los casos, excepto cuando tengo una “dirección” que es básicamente equivalente a \d+ .

Tienes que modificar tu 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”

El uso de expresiones regulares para validar la dirección IP es una mala idea, ya que pasará 999.999.999.999 como válido. Pruebe este método utilizando 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 método de análisis de host, este código lo 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 

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

de lo contrario, no tomará una dirección IP válida como 999.999.999.999, 256.0.0.0, etc.

Me encontré con la misma situación, encontré que la respuesta con el uso de la biblioteca de sockets fue útil, pero no proporciona soporte para direcciones ipv6. Encontré una mejor manera para ello:

Desafortunadamente funciona solo para python3

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

Usted está tratando de utilizar. como un . No como comodín para ningún personaje. Utilizar \. en cambio para indicar un período.

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

Solo para mantenerlo simple, he usado este enfoque. Sencillo como para explicar cómo se evalúa realmente la dirección ipv4. Comprobando si es un número binario aunque no es obligatorio. Espero que te guste esto.

 str = "255.255.255.255" print(str.split('.')) list1 = str.split('.') condition=0 if len(list1)==4: for i in list1: if int(i)>=0 and int(i)<=255: condition=condition+1 if condition!=4: print("Given number is not IP address") else: print("Given number is valid IP address") 

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

Contestame si tienes dudas?

 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 es solo 192.168.2.2 y suponiendo que 10.123.56.25 no es válida, ya que se combina con alguna cadena y 192.168.1.2.3 no es válida.

 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 permitirá obtener la dirección IP exacta, podemos ignorar que cualquier patrón se vea como una dirección IP pero no es válido. Ej: 'Address10.123.56.25', '789.356.441.561' '192.168.1.2.3' .

Por favor comente si se requieren modificaciones.

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"