2017-09-16 2 views
0

Angenommen ich ein Komma getrennt Linie haben:RegEx: Komma getrennt komplexe Gruppen

aa,bb,cc 

ich diese regex kann (nicht wirklich ok, weil dies auch ,aa passt, aber das ist hier nicht die Frage):

(<my pattern>)?(,<my pattern>)* 

Eg

([a-zA-Z]*)?(,[a-zA-Z]*)* 

Es sei nun angenommen, dass <my pattern> ist sehr lang und komplex, wäre es schön, wenn ich etwas sagen konnte, wie:

(<my pattern>)?(,<repeat previous/named group>)* 

Gibt es eine Möglichkeit zu sagen, eine bestimmte Gruppe zu wiederholen (Name) (in Python 3.5)

+0

' ist sehr lang und complex' Und , Na und? Dupliziere es einfach mit '(?: [A-zA-Z] +) (?:,? [A-zA-Z]) *' Da '' nichts Besonderes ist, gibt es keinen Grund, Rekursion zu verwenden . Verwenden Sie Rekursion nur dann, wenn Sie Text ausgleichen müssen (kann alles sein), da Rekursion im Allgemeinen einen beträchtlichen Overhead verursacht. – sln

Antwort

0

Ich fürchte, solche syntaktischen Zucker existiert nicht in Regex, aber wenn man bedenkt, dass Python Strings für Regex verwendet, können Sie einfach Strings Formatierung verwenden, um Ihren Code zu reduzieren:

+0

Solcher syntaktischer Zucker existiert, aber nicht in dem Modul Python re. Es existiert jedoch im Regex-Modul: https://pypi.python.org/pypi/regex. Beachten Sie, dass dieses Modul auch wiederholte Erfassungen unterstützt. Mit dieser Funktion können Sie gleichzeitig extrahieren und prüfen. –

+0

Es ist auch kein "syntaktischer Zucker", da dieses Merkmal die Rekursion ermöglicht und es erlaubt, ein Muster wie bei einem Lexer zu schreiben. –

0

Es gibt Regex-Engines, die diese Art der Rückreferenz unterstützen, aber die Regex-Engine von Python nicht.

Nur weil die Regex-Engine keine eingebaute Unterstützung dafür hat, bedeutet das nicht, dass wir kein Regex-Muster erstellen können, das unser Ziel erreicht. Alles, was wir tun müssen, ist die , in der Regex ändern - stattdessen ein Komma suchen wir ein Komma oder den Beginn der Zeichenfolge zulassen möchten:

((?:,|^)[a-zA-Z]*)* 
Verwandte Themen