Python3 - RegEx für ein LineEdit
-
Nehmen wir an, wir haben einen QLineEdit und wollen die Eingabe kontrollieren. Als Beispiel soll eine IPv4 Adresse dienen.
import
from PyQt5.QtCore import QRegExp from PyQt5.QtGui import QRegExpValidator
Objekt
self.lineedit1_ipv4 = QLineEdit(str(root[0][0].text), self)
Nicht verwirren lassen, das
str(root[0][0].text)
lädt aus einer XML Datei, die mir als Config dient, abgespeicherte Werte.
Validator
reg_ex = QRegExp("^(?:(?: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]?)$") input_validator = QRegExpValidator(reg_ex, self.lineedit1_ipv4) self.lineedit1_ipv4.setValidator(input_validator)
Das reg_ex dient als Vorlage, was gefiltert werden soll. Nein, das habe ich nicht erfunden das kann man im Netz fertig finden. z.B. hier -> https://www.oreilly.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
Mit dem input_validator wird ein Objekt erzeugt, dieses beinhaltet den reg_ex und die QLineEdit Zeile, auf die das angewendet werden soll.
In der nächsten Zeile, wenden wir das auf self.lineedit1_ipv4 an.
Als Resultat kann man nur noch IP-Adressen bis zu 255.255.255.255 eingeben. Wollte man 256. eingeben, würde die 6 schon geblockt.
Schönes Beispiel, mit dem ich sehr gut Eingabefelder filtern kann. So, die Python3 Stunde für heute beendet. Auf dem Bild seht ihr dann, was Morgen auf dem Stundenplan steht
Quellen
-
Gut, Menschen die mich kennen, wissen das IPv6 nicht so mein Spezialgebiet ist. Es hilft aber nichts, auch damit muss man sich beschäftigen
Es war etwas schwierig was Passendes zu finden, aber ich denke das hier ist ganz gut. Ob es alle Möglichkeiten bei IPv6 beinhaltet, weiß ich nicht zu 100%.
Hier eine Seite, wo ich was Passendes gefunden habe.
https://ihateregex.io/expr/ipv6/Code
# regex für IPv6 reg_ex = QRegExp('^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$') input_validator = QRegExpValidator(reg_ex, self.lineedit2_ipv6) self.lineedit2_ipv6.setValidator(input_validator)
Ein paar Test von mir ergaben, das es so aussieht als wenn es funktioniert