2017-02-07 8 views
0

Ich versuche, eine Liste aller Teils der Form zu erhalten:Python Regex findall() Rückkehr falschen Teils

Kolon + Folge von zwei Buchstaben unter bestimmten Sequenzen + Zahlenwert mit mindestens 1 Ziffer

import re 
DATA_SUB = ':(TI|LO|TE|HU|AN|FO)[0-9\.]+' 
print(re.findall(DATA_SUB, '%145:TI15:LO1.6213:TE97$')) 

Ergebnis:

['TI', 'LO', 'TE'] 

wobei es sein sollte:

[':TI15', ':LO1.6213', ':TE97'] 

am re.findall Suche() Dokumentation:

Zurück alle nicht-überlappende Spiele von Muster in String, als eine Liste von Strings

kann man schließen, dass die oben beschriebene Methode sollte arbeite. Was mache ich falsch?

+0

Verwenden 'DATA_SUB =‚:(?: TI | LO | TE | HU | AN | FO) [0-9 \.] + '' –

+1

Siehe auch http://StackOverflow.com/a/32105510/3832970 –

Antwort

1

Durch die Verwendung von Klammern Sie eine Capture-Gruppe definiert, und so Sie Bittet Python, die Liste der Captures zurückzugeben. Durch ?: vor der Gruppe platzieren, machen Sie es sich um eine Nicht-Capture-Gruppe:

import re 
DATA_SUB = ':(?:TI|LO|TE|HU|AN|FO)[0-9\.]+' 
print(re.findall(DATA_SUB, '%145:TI15:LO1.6213:TE97$')) 

Wenn Sie zum Beispiel zwei Einfanggruppen definieren würde, generiert eine Liste von Tupeln mit den Aufnahmen von die beiden Gruppen:

# educational counter example 

import re 
DATA_SUB = ':(TI|LO|TE|HU|AN|FO)([0-9\.]+)' 
print(re.findall(DATA_SUB, '%145:TI15:LO1.6213:TE97$')) 

generieren:

[('TI', '15'), ('LO', '1.6213'), ('TE', '97')] 
+3

Einige ungeklärte downvoting – anubhava

+1

@anubhava: Wenn ich mich richtig erinnere gibt es einige (seltsam) Abzeichen/Hut, die Sie von Downvoting viel ... –

+0

Die pädagogische Gegenbeispiel stellte sich heraus zu sein, was ich letztlich wollte gewinnen konnte! – wit221

2

Verwenden Sie eine Nicht-Capture-Gruppe anstelle eine Erfassungsgruppe in Ihrer Regex immer erfassten Daten in der Ausgabe von findall zu vermeiden:

>>> DATA_SUB = ':(?:TI|LO|TE|HU|AN|FO)[0-9.]+' 
>>> print re.findall(DATA_SUB, '%145:TI15:LO1.6213:TE97$') 
[':TI15', ':LO1.6213', ':TE97'] 
+3

Warum wird dies abgelehnt? –

+1

Ich frage mich auch – anubhava

+0

Danke. Können Sie auch erklären, warum es möglich ist, das vor dem Punkt liegende Escape-Zeichen zu entfernen und dabei das gleiche gewünschte Ergebnis zu erzielen? – wit221