2010-11-19 6 views
2
m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s) 

Comment puis-je le modifier pour qu'il corresponde non seulement à IPv4, mais aussi à quelque chose avec CIDR comme 10.10.10.0/24?python regex CIDR correspondant

Répondre

0

Ajouter "(?:/\d{1,2})?".

Vous obtenez r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?" pour un motif.

0

ce étend votre expression existante

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\\\d{1,2} 
3

(?:\d{1,3}\.){3}\d{1,3}(?:/\d\d?)?

+0

400.123.34.56 est apparié mais pas valide (mais regex de asdasdasd a le même problème) – Tim

+1

Juste pour info, le '/' peut devoir être échappé dans des langages tels que Javascript. – Dave

1

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2}|)

testé dans Expresso

Correspondant:

64.33.232.212 
64.33.232.212/30 
1

J'ai rencontré des problèmes lors de l'utilisation d'une regex similaire à la vôtre. Il correspondait à 1.2.3.4.5 (comme 1.2.3.4) et 1111.2.3.4 (comme 111.2.3.4). Pour éviter ces correspondants, j'ai ajouté regarder vers l'avenir/derrière les affirmations:

IP_RE  = re.compile(r"(?<!\d\.)(?<!\d)(?:\d{1,3}\.){3}\d{1,3}(?!\d|(?:\.\d))") 
IP_CIDR_RE = re.compile(r"(?<!\d\.)(?<!\d)(?:\d{1,3}\.){3}\d{1,3}/\d{1,2}(?!\d|(?:\.\d))") 

Les (?<!\d\.)(?<!\d) vérifie qu'il n'y a pas un numéro ou octet avant votre premier octet (ie: n ° 1 avant 111.2.3.4). Et (?!\d|(?:\.\d)) vérifie qu'il n'y a pas un nombre/octet après votre dernier (ie: n ° 5 après 1.2.3.4).

Ensuite, pour vérifier que les chaînes ceux-ci correspondent sont les adresses IP valides (par exemple: non 277.1.1.1), vous pouvez utiliser

socket.inet_aton(ip) #raises exception if IP is invalid

0

Il y a un all_matching_cidrs (ip, cidrs) fonction dans l'IP netaddr module prend une ip et l'associe à une liste d'adresses CIDR.