2016-05-10 4 views
2

","(.*?) (Railway Station)Regex: Extrahieren mehrere Teil, entspricht die Variante ignoriert

Ich brauche eine Station Stadt und Breite/Länge aus einer Liste von Rohdaten in folgendem Format zu extrahieren:

"22238","Flinders Street Railway Station (Melbourne City)","-37.8183051340585","144.966964346166" 
"22239","North Melbourne Railway Station (West Melbourne)","-37.8063098353473","144.94151017321" 
"22240","Footscray Railway Station (Footscray)","-37.8014134330439","144.902020057667" 
"22241","Sunshine Railway Station (Sunshine)","-37.7885363319246","144.832878204953" 

Der gewünschte Ausgang wobei:

Flinders Street-37.8183051340585,144.966964346166
North Melbourne-37.8063098353473,144.94151017321
Footscray-37.8014134330439,144.902020057667
Sunshine-37.7885363319246,144.832878204953

Ich bin nach ein paar Ratschläge, wie dies zu handhaben.

Mit ","(.*?) (Railway Station) die Station Stadt extrahiert wird, aber es gibt zwei andere unerwünschte Begegnungen:

","Flinders Street Railway Station
Flinders Street
Railway Station

Im oben, wie könnte ich Flinders Street allein Vorstellungen?

Zweitens, um den Breiten- und Längengrad abzurufen, sollte ich einen separaten Regex-Aufruf durchführen, oder ist das alles mit einem einzigen Suchmuster möglich?

Und schließlich, sollte ich die Zitate aus dem Breiten-/Längengrad mit Regex oder nachher in meinem Code entfernen, das Problem in zwei Schritte aufteilen.

Zum Beispiel von:
"-37.8183051340585","144.966964346166"
zu:
-37.8183051340585,144.966964346166

Alternativ, ich bin im falschen Winkel auf diesem Kommen und es wäre einfacher, den Text mit , als Trennzeichen zu spalten, sich dann auf die kleineren Teilstränge mit einem bestimmten Muster konzentrieren. Was sind deine Gedanken?

+0

Was ist Ihre Sprache? Ich bin mir nicht sicher, ob die Verwendung von nur Regex effizient sein könnte. Ihre Daten scheinen CSV zu sein. Sie können also nur jede Zeile wiederholen, alle Komponenten der CSV-Datei abrufen (da sie durch "," getrennt sind) und das Vorhandensein des gesuchten Begriffs in der zweiten Komponente prüfen. Es wäre dann einfacher, Ihren lat/long nach Ihrem Wunschformat zu verketten. Es kann einfacher sein, den Code in ein paar Monaten zu lesen. – Larme

+0

Die Sprache ist Python. Einverstanden, ich finde, dass Regex-Muster 5 Minuten nach dem Schreiben grundsätzlich nicht lesbar sind. –

+0

Verwenden Sie 're.findall (r '", "(. *?) Bahnhof", Eingabe) ', oder wenn Sie' re.search' verwenden, greifen Sie mit 'matchObj.group (1)' auf den Wert der Gruppe 1 zu . –

Antwort

2

können Sie tun:

"([^"]+)\s+Railway\sStation[^,]+,"([^"]+)","([^"]+)"$ 

\1Flinders Street ist, \2-37.8183051340585 ist, \3144.966964346166 ist.

Demo

+0

Perfekt, ich werde sicherstellen, dass ich es verstehe, bevor ich es benutze, danke. –

+0

@livin_amuk Kein Problem – heemayl

1

Ihre regex ","(.*?) (Railway Station) Streichhölzer, wie Sie sagen, in einem Beispiel, ","Flinders Street Railway Station. Es erfasstFlinders Street und Railway Station. Beachten Sie den Unterschied zwischen Übereinstimmung und Erfassung. Matching ist alles, was die Regex (natürlich) zusammenbringt. Captures sind Teile der Regex in (). Wie Ihre (.*?) - und - (Railway Station) gibt Ihnen zwei Capture-Gruppen.

Um nur die Railway Station","(.*?) Railway Station zu entfernen. Dies wird entsprechen das gleiche wie Ihre, aber nur erfassen die Station. Um dann zu passen, ohne die Stadt zu erfassen, fügen Sie \([^)]*\) hinzu, die den Klammern und irgendetwas dazwischen entspricht.

Schließlich ","([^"]*)","([^"]*)" Zugabe wird erfassen die Koordinaten in zwei Einfanggruppen die endgültige

","(.*?) Railway Station \([^)]*\)","([^"]*)","([^"]*)" 

geben den Job zu erledigen.

Check it out here at regex101.

Mit freundlichen Grüßen

+0

Große Erklärung, danke. –