Korrekte IP-Adresse Eingabe Python?
Wie kann ich in Python den Input so überprüfen lassen dass es eine korrekte IP Adresse ist? Also z.B. mit den Filtern: 1. Klein und groß Buchstaben sind verboten 2. Alle Sonderzeichen außer "." Sind verboten. 3. Weniger und mehr als 3 Punkte sind verboten 4. 2 oder 3 Punkte hintereinander sind verboten 5. Weniger als 4 und mehr als 12 Zahlen sind verboten 6. Mehr als 3 Zahlen hintereinander sind verboten 7. Zahlen über 255 sind verboten usw. Und am Ende muss ich dann ein If-Statement machen wo dann entweder "IP ist gültig" oder "IP ist nicht gültig" ausgegeben wird.
4 Antworten
Das geht gut mit RegEx (Regular Expressions), z. B.:
import re
REGEX_IPV4 = '^(?:(?: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]?)$'
if re.match(REGEX_IPV4, input_ip) is not None:
print(input_ip + "is a valid IP Address")
Und wie würde es bei MAC-Adressen aussehen? Bloß es sollen auch nur die ersten 6 Ziffern mit und ohne ":" eingegeben werden können und klein Schreibung muss auch akzeptiert werden also z.B. ffffff oder ff:ff:ff bei FF:FF:FF:FF:FF:FF soll auch akzeptiert werden aber es sollen keine Zeichen dabei sein die bei Hexadezimal (MAC Adressen) nicht gibt also z.B. alles ab g im Alphabet.
Neben den bisher beschriebenen RegExps gibt es natürlich je nach Anwendungsfall weitere Möglichkeiten:
>>> socket.inet_aton('269.3.14.45')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: illegal IP address string passed to inet_aton
>>> socket.inet_aton('192.168.0.31')
b'\xc0\xa8\x00\x1f'
v4 only!
>>> socket.inet_pton(socket.AF_INET6,'fe80::ec4:7aff:fec8:8090')
b'\xfe\x80\x00\x00\x00\x00\x00\x00\x0e\xc4z\xff\xfe\xc8\x80\x90'
>>> socket.inet_pton(socket.AF_INET6,'fe80::ec4::7aff:fec8:8090')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: illegal IP address string passed to inet_pton
>>> socket.inet_pton(socket.AF_INET,'280.0')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: illegal IP address string passed to inet_pton
>>> socket.inet_pton(socket.AF_INET,'192.168.0.30')
b'\xc0\xa8\x00\x1e'
D.h., Du fängst die Exception, um festzustellen, daß es keine gültige IP ist.
Ein anderer Ansatz, der ohne RegExp auskommt:
ipstr="192.168.900.12"
len( [atom for atom in ipstr.split('.') if int(atom)>=0 and int(atom)<256] )
Im Falle einer Exception oder wenn len!=4, handelt es sich um keien IPv4.
Dies geht mit Regex. Kenn mich nicht so aus damit aber schau mal hier:
https://stackoverflow.com/questions/11264005/using-a-regex-to-match-ip-addresses-in-python
Und anscheinend gäbe es noch eine "schönere" Variante über Sockets.
Mit Hilfe des ipaddress moduls kannst du das ab Python 3.3 recht einfach lösen, z.B.:
import ipaddress
ip=input("IP eingeben:")
try:
ipaddress.IPv4Address(ip)
print("%s ist eine gültige IP" % ip)
except:
print("%s ist keine gültige IP" % ip)