2016-04-08 6 views
0

Ich verwende re-Modul Python, und ich möchte eine von zwei möglichen Elementen suchen und zu erfassen, aber ich kann nicht herausfinden, wie die Gruppierung und nicht Capturing erhalten Gruppierung Recht auf Arbeit:Python Regex Gruppierung

Können sagen, mein Muster:

(?:(test)55)|(apple) 

Also im Grunde mag ich ‚Test‘ oder ‚Apfel‘ erfassen, sondern nur erfassen ‚Test‘, wenn er hier gefolgt wird von 55.

Das Problem ist, dass ich am Ende mit 2 Capture-Gruppen, so dass ich entweder mit (keine, 'Apple') oder ("Test", Keine).

Ich weiß, dass ich kann einfach nachbearbeiten es:

next(item for item in groups() if item is not None) 

aber ich habe mich gefragt, ob es einen Weg zur Phrase ist es in der Regex, die es funktionieren würde (ich will nur lernen regex besser).

Danke.

+0

Sie zwei bekommen, weil '(Test)' eine Erfassungsgruppe ist, auch. – alexis

+0

Ein Match-Objekt hat ein Attribut 'lastindex', das den Index der letzten erfassenden Gruppe zurückgibt, die mit etwas übereinstimmte. Wenn sich die Capture-Gruppen gegenseitig ausschließen, wie in Ihrem Beispiel, könnte Ihre Post-Verarbeitung zu 'matchobject.group (matchobject.lastindex)' vereinfacht werden – RootTwo

Antwort

1

Um nur eine Gruppe zu erfassen, verwenden Sie nur eine Gruppe von Erfassungsklammern mit (test|apple). Fügen Sie einen Look-Ahead so muss dieser Test durch 55 folgen:

re.findall(r"(test(?=55)|apple)", mystring);