Ich möchte eine IP und einen Port aus einer zurückgegebenen Liste extrahieren. Ich verwende derzeit den Befehl str (var) .replace, um zusätzliche Zeichen zu entfernen. Dies wird zu Problemen führen, wenn sich das Zeichenfolgenformat ändert, wodurch der Befehl .replace durch einen Fehler
verursacht wird %Vor% Also würde das Problem kommen, wenn:
[<Device: xxx.xxx.xxx.xxx:xxxx>]
geändert zu diesem:
[<now_what: xxx.xxx.xxx.xxx:xxxx>]
Die dicovery_device()
würde durch und Fehler.
Was ist die beste Vorgehensweise, um ein ip / port-Muster zu identifizieren und ip und port zu extrahieren, ohne auf die Integrität der umgebenden Zeichen angewiesen zu sein?
Von diesem: [<Device: 192.168.222.123:8075>]
Dazu: 192.168.222.123:8075
und vorzugsweise: [192.168.222.123, 8075]
Berücksichtigung von IP-Varianzen innerhalb von Punktblöcken und der größten Portnummer basierend auf 16-Bit (normalerweise 4 ganze Zahlen nach dem Doppelpunkt bis zu 5 ganzen Zahlen)
Unter der Annahme einer IPv4-Adresse versuchen Sie, Zahlen und kritische Interpunktion zu extrahieren. Schneiden Sie dann das gültige Ergebnis bei Bedarf ab. Auch die Validierung von IP-Adressen kann ein sicherer Ansatz sein.
In Python 3:
Code
%Vor%Demo
%Vor%Funktionen
Details
Typischerweise ist result
eine Liste mit der IP und einer optionalen Portnummer. In Fällen, in denen sich Zahlen im Gerätenamen befinden, enthält der erste Index des Ergebnisses jedoch unerwünschte Zahlen. Hier sind Beispiele für result
:
Die Ausnahmebehandlung prüft auf Nummern im Gerätenamen und validiert IP-Adressen im ersten oder zweiten Index. Wenn keine gefunden werden, wird eine Ausnahme ausgelöst.
Obwohl die Validierung von Portnummern außerhalb des Bereichs der Frage liegt, wird angenommen, dass Ports eine Nummer sind. Ein einfacher Test wurde zum validate_port
Decorator hinzugefügt, der wie gewünscht angewendet oder aktualisiert werden kann. Der Dekorator überprüft die Ausgabe von discover_device()
. Wenn der Port keine reine Zahl ist, wird eine Ausnahme ausgelöst. Siehe diesen Beitrag für Ändern von Einschränkungen. In diesem Blog finden Sie ein großartiges Tutorial zu Python-Dekoratoren.
Optionen
Wenn die Validierung kein Problem darstellt , sollte der folgende Code ausreichen, vorausgesetzt, "."
fehlt im Gerätenamen:
Wenn eine Nicht-Dekorator-Lösung bevorzugt wird , definieren Sie die folgende Funktion:
%Vor% Übergeben Sie nun die Rückgabewerte von discover_device()
an die letztere Funktion, d. h. return validate_port(result[1:])
und return validate_port(result)
.
Grüße an @coder für Vorschläge.
Dafür ist kein Regex erforderlich. Verwenden Sie die eingebaute Methode str
split
.
Wenn Sie wirklich eine Regex verwenden möchten, würde ich eine einfache verwenden:
%Vor%Sie können einfach eine Regex verwenden, um die IP-Adresse unabhängig von der vorherigen Adresse zu finden.
Zum Beispiel:
%Vor%Als Test:
%Vor%Ich denke, Ihre beste Wette ist die Verwendung regulärer Ausdrücke:
%Vor% Wenn Ihre Regex-Zeichenfolge (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:\:\d{1,5})?)
ist, lautet die Aufschlüsselung:
\d{1,3}\.
sucht zwischen 1 und 3 Ziffern, gefolgt von einem Punkt (?:\:\d{1,5})?
sucht nach einem Vorkommen von Semikolon oder Null, gefolgt von 1 bis 5 Ziffern (das ?:
gibt an, dass es sich um eine nicht erfassende Gruppe handelt, sodass es in Ihrem Ergebnis nicht selbst vorhanden ist) Wenn Sie möchten, dass Port und IP getrennt erfasst werden, können Sie
verwenden %Vor%Hier ist die Regex, wenn Sie damit spielen wollen.
Tags und Links python python-3.x