2016-09-12 5 views
3

Ich habe ein Muster, das für mehrere Schlüssel/Wert-Paare entspricht, und die Schlüssel/Wert-Strings können durch beliebige Zeichen getrennt werden, dann die Gruppen von Schlüssel/Wert kann auch abgegrenzt werden, nur nicht durch das gleiche Zeichen.Verweis auf benannte Gruppen in Look-around (Python 2.x)

Ich habe herausgefunden, wie dynamische Trennzeichen zulässig sind, und das gleiche Trennzeichen darf nicht zweimal verwendet werden. ZB:

\w+(?P<kv_delim>[:;|])\d+(?P<g_delim>(?!(?P=kv_delim))[:;|])\w(?P=kv_delim)\d(?P=g_delim)? 

You can view the regex101.com example here. Und es funktioniert gut, das Problem kommt, wenn Sie eine der beiden genannten Gruppen in einem positiven Look-Behind verwenden.

Läßt die Zeichenfolge sagen

foo:1;r:2

Das "Schlüssel/Wert-Trennzeichen" ist (mit dem Namen Gruppe: kv_delim) ist die :, dann ist die "Gruppe Begrenzer" (benannte Gruppe: grp_delim) die ;

sind

Was ich versuche zu tun ist dynamisch die : und ;, dann in einer Rundum-Erklärung, suchen Sie nach foo<kv_delim> oder bar<kv_delim>.

Wenn ich die Begrenzer (im Look-Around) fest codiere, you can see it works. Aber wenn ich versuche, die named-Gruppe kv_delim innerhalb der Look-around-Anweisung zu referenzieren, you can see it throws errors. Ich erhalte den Fehler:

Subpattern references are not allowed within a lookbehind assertion

Welche was kickin mein Hintern ist

Wer eine Möglichkeit haben, diese Arbeit zu machen?

Danke!

+0

Verwenden Sie einfach '.' anstelle einer Rückreferenzierung. –

+0

Teilen Sie einfach Dinge über ein paar Zeilen. Der Versuch, eine Zeichenkette mit einer einzigen Regex wie dieser zu analysieren, macht normalerweise unverständlichen und nicht überprüfbaren Code. – Evert

+0

Die [Dokumentation legt eindeutig fest] (https://docs.python.org/3/library/re.html#regular-expression-syntax) sowohl für negative als auch positive Look-Behind-Assertions: "Das enthaltene Muster darf nur Strings entsprechen einiger fester Länge ". – Evert

Antwort

0

Zusammenfassend das, was bereits gesagt wurde: Der Punkt ist, dass die Länge des Musters unbekannt ist, wenn Sie Rückreferenzen in einen Lookbehind setzen, must be fixed-width zur Entwurfszeit. Die neuere PyPi regex module hat keine Beschränkungen bezüglich der Länge in Bezug auf Lookbehind, so ist die aktuelle Problemumgehung mit Ihrem regex dieses Modul zu verwenden:

>>> import regex 
>>> s = "foo:1;r:2" 
>>> rx = r"\w+(?P<kv_delim>[:;|])\d+(?P<g_delim>(?!(?P=kv_delim))[:;|])\w(?P=kv_delim)\d(?P=g_delim)?" 
>>> print(regex.findall(rx, s)) 
[(':', ';')] 
>>> print([m.group() for m in regex.finditer(rx, s)]) 
['foo:1;r:2'] 
>>> 
Verwandte Themen