60 votes

vérifier si une chaîne de caractères correspond à un motif d'adresse IP en python ?

Quel est le moyen le plus rapide de vérifier si une chaîne de caractères correspond à un certain motif ? Les expressions rationnelles sont-elles le meilleur moyen ?

Par exemple, j'ai un tas de chaînes de caractères et je veux vérifier pour chacune d'entre elles s'il s'agit d'une adresse IP valide (valide dans ce cas signifie un format correct), est-ce que la façon la plus rapide de le faire est d'utiliser des expressions rationnelles ? Je ne sais pas si c'est le cas, mais je ne sais pas non plus s'il y a quelque chose de plus rapide avec un formatage de chaîne ou quelque chose comme ça.

C'est ce que j'ai fait jusqu'à présent :

for st in strs:
    if re.match('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', st) != None:
       print 'IP!'

3voto

Greg Hewgill Points 356191

Votre expression régulière ne vérifie pas la fin de la chaîne, donc elle correspondrait :

123.45.67.89abc123boogabooga

Pour remédier à ce problème, utilisez :

'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'

(noter les $ à la fin).

Enfin, en Python, le style habituel est d'utiliser is not None au lieu de != None .

3voto

Lucas Coelho Points 403

Les autres expressions rationnelles de cette page acceptent les adresses IP dont le nombre est supérieur à 255.

Cette regex permet d'éviter ce problème :

import re

def validate_ip(ip_str):
    reg = r"^(([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])$"
    if re.match(reg, ip_str):
        return True
    else:
        return False

2voto

Jungle Hunter Points 3485

Si vous validez l'adresse IP, je suggérerais ce qui suit :

import socket

try:
    socket.inet_aton(addr)
    return True
except socket.error:
    return False

Si vous souhaitez simplement vérifier que le format est correct, vous devez le faire pour tous les formats. bases légales (et pas seulement la numérotation en base 10).

De même, si les adresses IP sont uniquement IPv4 (et qu'aucune n'est IPv6), il suffit de rechercher les adresses valides et d'utiliser split() (pour obtenir des informations individuelles composants de la période d'enquête) et int() (à taper au crayon pour comparaison). Une référence rapide aux règles IPv4 valides est la suivante aquí .

2voto

Prem Anand Points 31

Installer le paquet netaddr

sudo pip install netaddr

Ensuite, vous pouvez faire ceci

>>> from netaddr import valid_ipv4
>>> valid_ipv4('11.1.1.2') 
True
>>> valid_ipv4('11.1.1.a')
False

Vous pouvez également créer un objet IPAddress à partir de cette chaîne et effectuer d'autres opérations liées à l'adresse IP.

>>> from netaddr import IPAddress
>>> ip = IPAddress('11.1.1.1')
>>> [f for f in dir(ip) if '__' not in f]
['_module', '_set_value', '_value', 'bin', 'bits', 'format', 'info', 'ipv4', 'ipv6', 'is_hostmask', 'is_ipv4_compat', 'is_ipv4_mapped', 'is_link_local', 'is_loopback', 'is_multicast', 'is_netmask', 'is_private', 'is_reserved', 'is_unicast', 'key', 'netmask_bits', 'packed', 'reverse_dns', 'sort_key', 'value', 'version', 'words']

2voto

shobhit_mittal Points 93

Iptools peut être utilisé.

import iptools
ipv4 = '1.1.1.1'
ipv6 = '5000::1'
iptools.ipv4.validate_ip(ipv4) #returns bool
iptools.ipv6.validate_ip(ipv6) #returns bool

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X