/ Sprawdzanie poprawności adresu / ip w pythonie przy użyciu regex [duplikat] - python, regex

sprawdzanie adresu IP w pythonie za pomocą wyrażenia regularnego [duplikat] - python, wyrażenie regularne

W poniższym sprawdzeniu poprawności adresu IP chcę sprawdzić, czy jest to prawidłowy adres IP, czy nie, jak mogę to zrobić, korzystając z poniższej instrukcji

>>> 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"

Odpowiedzi:

19 dla odpowiedzi nr 1

Zamiast tego użyj kotwic:

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

Zapewniają one dopasowanie początku i końca łańcucha na początku i na końcu wyrażenia regularnego. (cóż, technicznie rzecz biorąc, nie potrzebujesz początku ^ zakotwiczenie, ponieważ jest ukryte w .match() metoda).

Następnie sprawdź, czy wyrażenie regularne rzeczywiście pasuje, zanim spróbujesz uzyskać dostęp do jego wyników:

if aa:
ip = aa.group()

Oczywiście nie jest to dobre podejście do sprawdzania poprawności adresów IP (sprawdź odpowiedź gnibblera w celu uzyskania właściwej metody). Jednak wyrażenia regularne mogą być przydatne do wykrywania adresów IP w większym ciągu:

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

Tutaj b zakotwiczenia granicy słów upewnij się, że cyfry nie przekraczają 3 dla każdego segmentu.


26 dla odpowiedzi nr 2

Dlaczego nie użyć funkcji biblioteki do sprawdzenia adresu 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

11 dla odpowiedzi nr 3

d{1,3} dopasuje liczby jak 00 lub 333 a także który nie byłby prawidłowym identyfikatorem.

To jest doskonałą odpowiedzią smink, cytując:

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])$";

7 dla odpowiedzi № 4
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

0 dla odpowiedzi № 5

Poniższe sprawdzi, czy adres IP jest prawidłowy, czy nie: Jeśli adres IP mieści się w zakresie od 0.0.0.0 do 255.255.255.255, wówczas wynik będzie prawdziwy, w przeciwnym razie będzie fałszywy:

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

Przykład:

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

Wydajność:

>>> 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
>>>