Regexp para comprobar si una IP es válida

Me pregunto si es posible comparar valores en regexps con el sistema regexp en Python. Hacer coincidir el patrón de una IP es fácil, pero cada 1-3 dígitos no puede estar por encima de 255 y ahí es donde estoy un poco perplejo.

Necesitas verificar los números permitidos en cada posición. Para el primer dígito opcional, los valores aceptables son 0-2. Para el segundo, 0-5 ( si el primer dígito para esa parte está presente, de lo contrario 0-9), y 0-9 para el tercero.

Encontré este ejemplo anotado en http://www.regular-expressions.info/regexbuddy/ipaccurate.html :

\b(?:(?: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]?)\b 

No hay necesidad de expresiones regulares aquí. Algunos antecedentes:

 >>> import socket >>> socket.inet_aton('255.255.255.255') '\xff\xff\xff\xff' >>> socket.inet_aton('255.255.255.256') Traceback (most recent call last): File "", line 1, in  error: illegal IP address string passed to inet_aton >>> socket.inet_aton('my name is nobody') Traceback (most recent call last): File "", line 1, in  error: illegal IP address string passed to inet_aton 

Asi que:

 import socket def ip_address_is_valid(address): try: socket.inet_aton(address) except socket.error: return False else: return True 

Tenga en cuenta que las direcciones como ‘127.1’ podrían ser aceptables en su máquina (existen sistemas, incluidos MS Windows y Linux, donde los octetos faltantes se interpretan como cero, por lo que ‘127.1’ es equivalente a ‘127.0.0.1’ y ’10 .1.4 ‘es equivalente a ’10 .1.0.4’). Si necesita que siempre haya 4 octetos, cambie la última línea de:

 else: return True 

dentro:

 else: return address.count('.') == 3 

Puede verificar una dirección IP de 4 octetos fácilmente sin expresiones regulares en absoluto. Aquí hay un método de trabajo probado :

 >>> def valid_ip(ip): ... parts = ip.split('.') ... return ( ... len(parts) == 4 ... and all(part.isdigit() for part in parts) ... and all(0 <= int(part) <= 255 for part in parts) ... ) ... >>> valid_ip('1.2.3.4') True >>> valid_ip('1.2.3.4.5') False >>> valid_ip('1.2. 3 .4.5') False >>> valid_ip('1.256.3.4.5') False >>> valid_ip('1.B.3.4') False >>> 

Regex es para la coincidencia de patrones, pero para verificar una IP válida, debe verificar el rango (es decir, 0 <= n <= 255).

Puede usar expresiones regulares para verificar el rango, pero eso será un poco excesivo. Creo que es mejor que compruebes el patrón básico y luego el rango para cada número.

Por ejemplo, use el siguiente patrón para hacer coincidir una IP:

 ([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) 

Luego verifica si cada número está dentro del rango.

Lo siguiente es compatible con IPv4, IPv6 y Python 2.7 y 3.3

 import socket def is_valid_ipv4(ip_str): """ Check the validity of an IPv4 address """ try: socket.inet_pton(socket.AF_INET, ip_str) except AttributeError: try: socket.inet_aton(ip_str) except socket.error: return False return ip_str.count('.') == 3 except socket.error: return False return True def is_valid_ipv6(ip_str): """ Check the validity of an IPv6 address """ try: socket.inet_pton(socket.AF_INET6, ip_str) except socket.error: return False return True def is_valid_ip(ip_str): """ Check the validity of an IP address """ return is_valid_ipv4(ip_str) or is_valid_ipv6(ip_str) 

Las direcciones IP también se pueden verificar con la siguiente división,

 all(map((lambda x: 0<=x<=255),map(int,ip.split('.')))) and len(ip.split("."))==4 

Para mí eso es un poco más legible que el regex.

Creo que la gente está llevando esto demasiado lejos. Le sugiero que primero haga esto: ips = re.findall (‘(?: [\ D] {1,3}). (?: [\ D] {1,3}). (?: [\ d] {1,3}). (?: [\ d] {1,3}) ‘, página) luego divida los 4 números donde hay un’. ‘ y verifica si son más pequeños que 256

Necesitas esto-

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

Visualización de expresiones regulares

Demo Debuggex