2017-05-05 7 views
-2

ich einen Satz von Ergebnissen, die Ich mag würde mit Regex analysieren, und ich kann nicht scheinen, um einen Ausdruck zu finden, die funktioniert. Auf jeder Zeile in einer TXT-Datei befinden sich 2 Einträge, die jeweils eine Menge von bis zu 100 enthalten, gefolgt von einem Objektnamen mit unterschiedlichen Längen und Abständen.Regex, um mehrere Elemente auf einer einzelnen Zeile zu trennen

Beispiel:

7 BALLS OF STRING 13 CARDBOARD BOXES 
14 ROCKS 12 PENCILS 

Ich möchte in der Gruppe 1 und der zweite Eintrag der erste Eintrag mit der Menge übereinstimmen mit seiner Menge in Gruppe 2.

+1

Welche Sprache oder Werkzeug verwenden Sie? Wie hast du versucht, das zu lösen? –

+0

Bitte fügen Sie einige Beispielversuche hinzu, die Sie versucht haben. Die Gemeinschaft ist viel eher in der Lage, Ihnen zu helfen, sobald Sie es tun. – ThatChris

Antwort

0

Sie den folgenden regulären Ausdruck verwenden können und Muster, um es verwenden, während die Datei zu lesen, Zeile für Zeile:

^(\d*\s[A-Z\s]*)\s(\d*\s[A-Z\s]*)$ 

Hier ist ein anschauliches Beispiel: https://regex101.com/r/18dege/1

Hier

ein paar Details:

  • ^ entsprechen den Anfang der Zeichenfolge, $ das Ende davon
  • \d* eine beliebige Anzahl (0 oder mehr) von numerischen Zeichen gierig (gleich [0-9]*)
  • \s entspricht einem Leerzeichen (z. B. tab, Raum, etc.)
  • [A-Z\s]* beliebige Anzahl (0 oder mehr) von Großbuchstaben und Leerzeichen gierige
  • () eine passende Gruppe erzeugt (einige Teile der Zeichenfolge) zu extrahieren

Laut dem folgenden Kommentar können Großbuchstaben von Kleinbuchstaben gefolgt werden, die nicht übereinstimmen sollten. Ein Beispiel hierfür wäre:

7 BALLS OF STRING 13 CARDBOARD BOXES 
14 ROCKS 12 PENCILS 
18 TABLES 3 BLANKETS sewn with patches 

dieses Muster passen, können Sie den folgenden regulären Ausdruck verwenden:

^(\d*\s[A-Z\s]*?)[a-z\s]*\s(\d*\s[A-Z\s]*?)[a-z\s]*$ 

Als Update auf das obige Muster habe ich hinzugefügt folgende:

  • [a-z\s]* zwischen den Aussagen (in der Gruppe) und nach der zweiten Anweisung, einen Klein String
  • passenIch habe ein Fragezeichen ? hinzugefügt, um die Übereinstimmung nicht-gierig zu machen. Dadurch wird verhindert, dass der Leerraum zwischen Groß- und Kleinschreibung der entsprechenden Gruppe hinzugefügt wird. Es ist nun erforderlich, dass am Ende des Musters ein Ende des Zeichenkettenzeichens $ steht, andernfalls würde die zweite Gruppe nicht genügend Zeichen entsprechen. Hier

ist ein anschauliches Beispiel: https://regex101.com/r/18dege/2

+0

Erstaunlich. Das hat funktioniert. Vielen Dank. – ryang

+0

Hey, Sie oben funktioniert großartig, aber ich fand einige zusätzliche Ausnahmefälle in diesem Datensatz, die ich hoffte, dass ich etwas Hilfe bekommen könnte. Zusätzlich zu den oben genannten, habe ich auch Einträge mit einzelnen Einträgen in einer Zeile sowie Einträge mit Notizen. Alle Daten, die ich will, sind in allen Caps, die ich nicht brauche. Jede Hilfe würde sehr geschätzt werden. 7 Fadenbälle 13 KARTONS 14 ROCKS 12 PENCILS 18 TABELLEN 3 DECKEN mit Patches genäht – ryang

+0

Also, die Kleinbuchstaben sind immer nach den Großbuchstaben und sollte nicht zugeordnet werden? –

Verwandte Themen