web-dev-qa-db-fra.com

Utiliser un RegEx pour faire correspondre les adresses IP en Python

J'essaie de faire un test pour vérifier si une entrée sys.argv correspond au RegEx pour une adresse IP ...

En guise de test simple, j'ai les éléments suivants ...

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"

Cependant, lorsque je lui passe des valeurs aléatoires, il renvoie "Adresse IP acceptable" dans la plupart des cas, sauf lorsque j'ai une "adresse" qui est fondamentalement équivalente à \d+.

16
MHibbin

Vous devez modifier votre regex de la manière suivante

pat = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")

c'est parce que . est un caractère générique qui signifie "chaque caractère"

21
DonCallisto

Utiliser regex pour valider l’adresse IP est une mauvaise idée - cela passera comme 999.999.999.999 valide. Essayez plutôt cette approche en utilisant socket - une validation bien meilleure et tout aussi facile, sinon plus facile à faire.

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 vous voulez vraiment utiliser l'approche parse-the-Host à la place, ce code le fera exactement:

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
30
Maria Zverina

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

sinon vous ne prenez pas une adresse IP valide comme 999.999.999.999, 256.0.0.0 etc.

12
burning_LEGION

Je suis tombé sur la même situation. J'ai trouvé la réponse utile avec l'utilisation de la bibliothèque de socket, mais cela ne fournit pas de support pour les adresses ipv6. Trouvé un meilleur moyen pour cela:

Malheureusement cela ne fonctionne que pour 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')
5
Deepak

Vous essayez d'utiliser. comme un . pas comme le joker pour aucun caractère. Utilisez plutôt \. pour indiquer un point.

3
BlackVegetable
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')
1
manju thimmareddy
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")
0
Karthic Kannan
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"

Pour simplifier les choses, j’ai utilisé cette approche . Simple pour expliquer comment l’adresse ipv4 est évaluée . Vérifier si son nombre binaire n’est pas nécessaire . J'espère que vous aimez cela.

0
Vaibhav Chaturvedi