2017-08-18 6 views
-3

gegeben haben Ich muss den ganzen Text erhalten, der zwei oder mehr Räume "\ s {2,}" um sie herum hat.Übereinstimmende Wörter, die Regex um

mit dem folgenden Text:

IP Address Name   Location   Type 
10.1.10.5 USLAXBOWC01RB Santa Monica, CA local 


Ich brauche zu extrahieren:

Line1:"IP Address", "Name", "Location", "Type"
Netz2:"10.1.10.5", "USLAXBOWC01RB", "Santa Monica, CA", "local"

EDIT:

Text, die für Extraktion:

"IP Address" & "Name" sind zwei oder mehr Leerzeichen getrennt, so dass sie berechtigt sind extrahiert werden. In ähnlicher Weise "Santa Monica, CA" & "local".

+0

suchen Was ist das Problem? Wie machst du das genau? –

+0

Was Regex Geschmack? Was ist ein Wort für dich? Warum fehlt ein Leerzeichen in der "IP-Adresse" der ersten Zeile? Ist "Santa Monica, CA" ab der 3. Zeile ein einzelnes Match mit einem Komma oder zwei separaten Matches? Warum nicht einen Textparser mit fester Breite verwenden? – Aaron

+0

Split auf 2 oder mehr Leerzeichen. – Toto

Antwort

2

Sie versuchen, Ihren Text nach dem Muster "\s{2,}" zu teilen.

So in Python, die Regex lib re geben Sie alle benötigten Werkzeuge:

import re 
line = "IP Address Name   Location   Type" 

result = re.split('\s{2,}',line) 

Welche gibt:

['IP Address', 'Name', 'Location', 'Type'] 

EDIT

Ich denke, ich ein wenig verstanden mehr Ihre Frage: Sie kümmern sich mehr darum, eine Sequenz zwischen \s{2,} zu isolieren, als sie zu trennen. In Ihrem Beispiel scheint jedoch die obige Lösung am besten geeignet zu sein.

fragte Sie für einen regulären Ausdruck, hier ist es:

reg1 = "[^\s](?!\s{2,})(?:.(?!\s{2,}))*[^\s]" 
  1. Er wählt zunächst einen Charakter, der mit [^\s](?!\s{2,}) nicht gefolgt von zwei Leerzeichen oder mehr kein Raum ist. Um dies zu tun, habe ich die negative Lookahead Assertion (?!...);
  2. Dann isoliert es eine Gruppe (?:...), die auf diese Weise zusammengesetzt ist: irgendein Zeichen ., dem \s{2,} nicht folgt;
  3. Wiederholen mit *;
  4. Es passiert, dass das letzte Zeichen nicht ausgewählt ist, wenn wir jetzt aufhören. Also sollten wir noch eins [^\s] hinzufügen.

Eine re.findall(reg1,line), und Sie sollten fertig sein. Ein Nachteil vielleicht: es erkennt Sequenzen, die mindestens zwei Zeichen lang sind.

In diesem Fall könnte ein anderer und einfacherer Regex den Job schließlich abschließen: reg2 = "\s{2,}([^\s])\s{2,}". Es wählt einzelne Nicht-Leerzeichen aus, die von zwei oder mehr Leerzeichen umgeben sind.Die Verwendung der Klammer (...) bewirkt, dass nur das Zeichen zurückgegeben wird.

By the way, rate ich dringend einen Blick auf die Dokumentation: https://docs.python.org/2/library/re.html

Hoffnung gefunden was Sie für :-)

+0

Also gibt es nicht so, dass wir eine Regex dafür schreiben können? – codingkapoor

+0

@codingkapoor '\ s {2,}' ist ein regulärer Ausdruck. Meinst du, du würdest lieber eine Regex verwenden, um zu "passen" anstatt zu "teilen"? – Aaron

+0

@Aaron Scala hat eine API, die mir eine Liste aller Übereinstimmungen geben kann. Also habe ich mir überlegt, eine Regex wie oben beschrieben zu erstellen! Es würde zu einer bestehenden Logik passen. Außerdem würde ich etwas Neues lernen! :) – codingkapoor

Verwandte Themen