Regex: Wiederholtes erfassen von Gruppen
Habe ich zu analysieren, einige Tabellen aus einer ASCII-text-Datei. Hier ist eine teilstichprobe:
QSMDRYCELL 11.00 11.10 11.00 11.00 -.90 11 11000 1.212
RECKITTBEN 192.50 209.00 192.50 201.80 5.21 34 2850 5.707
RUPALIINS 150.00 159.00 150.00 156.25 6.29 4 80 .125
SALAMCRST 164.00 164.75 163.00 163.25 -.45 80 8250 13.505
SINGERBD 779.75 779.75 770.00 773.00 -.89 8 95 .735
SONARBAINS 68.00 69.00 67.50 68.00 .74 11 3050 2.077
Die Tabelle besteht aus 1 Spalte mit text und 8 Spalten von floating-point-zahlen. Ich würde gerne die Aufnahme jeder einzelnen Spalte über regex.
Ich bin ziemlich neu auf reguläre Ausdrücke. Hier ist die fehlerhafte regex-Muster, die ich kam mit:
(\S+)\s+(\s+[\d\.\-]+){8}
Aber das Muster erfasst werden nur die ersten und die letzten Spalten. RegexBuddy strahlt auch die folgende Warnung:
Sie wiederholt die capturing group
selbst. Die Gruppe wird die Aufnahme nur
die Letzte iteration. Setzen Sie ein erfassen
Gruppe rund um die Gruppe wiederholt
erfassen Sie alle Iterationen.
Habe ich konsultiert Ihrer Hilfe-Datei, aber ich habe keine Ahnung, wie man dieses Problem lösen.
Wie kann ich die Aufnahme jeder einzelnen Spalte separat?
- Welche Sprache verwenden Sie? In .NET ist es einfach.
- Ja, ich habe die Absicht, das Programm zu schreiben in C#. Aber im moment, ich bin prototyping in Python.
- Siehe auch: stackoverflow.com/questions/3029127/...
- Schönes Muster. Dank
- Es kann abgerufen werden bei der Gruppe erfasst. Werfen Sie einen Blick auf stackoverflow.com/questions/11051558/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C# (geändert von dieses Beispiel):
Ausgabe:
Captures
ist ein nettes feature, aber es scheint wie overkill hier. Warum nicht einfach split jede Zeile am Leerzeichen? Selbst wenn du den regex zu validieren, das format der Zeile, es ist immer noch weniger Arbeit.Leider müssen Sie wiederholen Sie die
(…)
8 mal, um jede Spalte einzeln.Wenn der code möglich ist, können Sie die ersten mit denen numerische Spalten als ganzes
dann teilen Sie die Spalten durch Leerzeichen
Wenn Sie wissen wollen, was die Warnung erscheint, weil Ihre capture-Gruppe mit mehreren Zeiten (8, wie von Ihnen angegeben), aber die capture-variable kann nur ein Wert. Es erhält den letzten Wert verglichen.
Wie beschrieben in Frage 1313332, abrufen von diese mehrere Treffer ist generell nicht möglich mit einem regulären Ausdruck, obwohl .NET und Perl 6 haben einige Unterstützung für Sie.
Die Warnung deutet darauf hin, dass Sie könnte eine andere Gruppe um den ganzen Satz wie dieser:
Würden Sie dann in der Lage sein, um alle Spalten zu sehen, aber natürlich wären Sie nicht getrennt werden. Weil es in der Regel nicht möglich, erfassen Sie separat, die mehr gemeinsame Absicht ist es, zu erfassen, und die Warnung hilft, die Sie daran erinnern.