Extrahiere IPs und Ports aus einer Liste in Python 3.x

8

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)

    
Enrique Bruzual 15.09.2017, 19:50
quelle

4 Antworten

3

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

  • unempfindlich gegenüber umgebenden Zeichen
  • IP-Adressvalidierung (nicht IPv6) und Ausnahmebehandlung
  • Schutz vor Nummern im Gerätenamen
  • validiert Portnummern (optional)

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 :

%Vor%

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:

%Vor%

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.

    
pylang 15.09.2017, 20:31
quelle
4

Dafür ist kein Regex erforderlich. Verwenden Sie die eingebaute Methode str split .

%Vor%

Wenn Sie wirklich eine Regex verwenden möchten, würde ich eine einfache verwenden:

%Vor%     
Zach Gates 15.09.2017 19:58
quelle
2

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%     
Eric Duminil 15.09.2017 19:55
quelle
-1

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.

    
RagingRoosevelt 15.09.2017 19:59
quelle

Tags und Links