2016-03-22 7 views
1

kurz zusammengefasst: ich die Lookahead Technik in Python mit den ?P<name> Konvention (Details here) verwenden möchten, um die Gruppen von Namen zu erhalten.= und P in einem regex

weitere Details:

ich den Look-Ahead Trick here entdeckt; z.B. die folgende regex ...

/^(?=.*Tim)(?=.*stupid).+ 

... ermöglicht Strings wie "Tim stupid" oder "stupid Tim", ist die Reihenfolge wichtig ist, nicht zu erkennen.

Ich kann nicht herausfinden, wie ich den ?= "Operator" mit dem ?P eins kombinieren kann; die folgende regex offensichtlich nicht nicht den Trick, sondern gibt eine Vorstellung davon, was ich will:

/^(?=?P<word1>.*Tim)(?=?P<word2>.*stupid).+ 
+1

Meinst du ['^ (? = (? P . * Tim)) (? = (? P . * Dumm)). +'] (Https://regex101.com/r/wW3bR3/ 1)? –

+1

@suizokukan: Eine * einfangende * Gruppe ist ein '(...)'. Die '(? = ...)' sind * Lookaheads *. –

Antwort

1

Die ?P<word1> in Ihrem regex eines named capture group erinnert:

Die Syntax für eine benannte Gruppe ist eine der Python-spezifischen Erweiterungen: (?P<name>...). *name* ist offensichtlich der Name der Gruppe. Benannte Gruppen verhalten sich genauso wie einfangende Gruppen und ordnen darüber hinaus einen Namen einer Gruppe zu.

Also, höchstwahrscheinlich Sie suchen einen Weg, um Capture Substrings in einem positiven Look-Ahead am Anfang verankert eine Zeichenfolge erfordern beiden Muster gerecht zu werden, und erfassen den Teil innen sowohl die Lookaheads:

^(?=(?P<word1>.*Tim))(?=(?P<word2>.*stupid)).+ 
    ^^^^^^^^^^ ^ ^^^^^^^^^^  ^

Siehe regex demo

Beachten Sie, dass, wenn Sie sich nicht die Zeichenfolge benötigen, .+ überflüssig ist und entfernt werden kann. Möglicherweise möchten Sie die Grenzen der benannten Erfassungsgruppen bei Bedarf neu anpassen.

+1

Danke für alle: Ihre Erklärungen sind sehr klar. – suizokukan

+0

Genauer gesagt (?): '^ (? =. * (? P Tim)) (? =. * (? P dumm)). +' – suizokukan