web-dev-qa-db-fra.com

validation d'adresse ip en python avec regex

Dans la validation d'adresse IP suivante, je veux voir si c'est une adresse IP valide ou non, comment puis-je le faire en utilisant le

>>> ip="241.1.1.112343434" 
>>> aa=re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[^0-9]",ip)
>>> aa.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
10
Rajeev

Utilisez des ancres à la place:

aa=re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",ip)

Ceux-ci s'assurent que le début et la fin de la chaîne correspondent au début et à la fin de l'expression régulière. (Eh bien, techniquement, vous n'avez pas besoin de l'ancre ^ de départ car elle est implicite dans la méthode .match()).

Ensuite, vérifiez si l'expression rationnelle correspond effectivement avant d'essayer d'accéder à ses résultats:

if aa:
    ip = aa.group()

Bien sûr, ce n'est pas une bonne approche pour valider les adresses IP (consultez la réponse de gnibbler pour connaître la méthode appropriée). Cependant, les expressions rationnelles peuvent être utiles pour détecter les adresses IP dans une chaîne plus longue:

ip_candidates = re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", ip)

Ici, les ancres de limite de code \b s'assurent que les chiffres ne dépassent pas 3 pour chaque segment.

24
Tim Pietzcker

Pourquoi ne pas utiliser une fonction de bibliothèque pour valider l'adresse IP?

>>> ip="241.1.1.112343434" 
>>> socket.inet_aton(ip)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.error: illegal IP address string passed to inet_aton
31
John La Rooy

\d{1,3} correspondra à des nombres comme 00 ou 333 également qui ne seraient pas des identifiants valides.

Ceci est une excellente réponse de smink, citant:

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
13
Llamageddon
try:
    parts = ip.split('.')
    return len(parts) == 4 and all(0 <= int(part) < 256 for part in parts)
except ValueError:
    return False # one of the 'parts' not convertible to integer
except (AttributeError, TypeError):
    return False # `ip` isn't even a string
8
Karl Knechtel

Les éléments suivants vérifieront si une adresse IP est valide ou non: Si l’adresse IP est comprise entre 0.0.0.0 et 255.255.255.255, le résultat sera true, sinon la valeur sera false:

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

Exemple:

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

Sortie:

>>> your_ip = "10.10.10.10"
>>> [0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4
True
>>> your_ip = "10.10.10.256"
>>> [0<=int(x)<256 for x in re.split('\.',re.match(r'^\d+\.\d+\.\d+\.\d+$',your_ip).group(0))].count(True)==4
False
>>>
0
Ranga