2017-05-09 3 views
0

Ich versuche, mehrere zu erfassen „<Attribut> = <Wert>“ Paare mit einem Python regular expression aus einem String wie folgt aus:Regulärer Ausdruck fängt nur das letzte Auftreten der wiederholten Gruppe

some(code) ' <tag attrib1="some_value" attrib2="value2"     en=""/> 

Der reguläre Ausdruck '\s*<tag(?:\s*(\w+)\s*=\"(.*?)\")* ist soll solche Paare mehrere Male entsprechen, dh Rückkehr etwas wie

"attrib1", "some_value", "attrib2", "value2", "en", "" 

aber es fängt nur das letzte Vorkommen:

>>> import re 
>>> re.search("'\s*<tag(?:\s*(\w+)\s*=\"(.*?)\")*", ' some(code) \' <tag attrib1="some_value" attrib2="value2"     en=""/>').groups() 
('en', '') 

Fokussierung auf <attrib> = "<Wert>" funktioniert:

>>> re.findall("(?:\s*(\w+)\s*=\"(.*?)\")", ' some(code) \' <tag attrib1="some_value" attrib2="value2"     en=""/>') 
[('attrib1', 'some_value'), ('attrib2', 'value2'), ('en', '')] 

so eine pragmatische Lösung könnte "<tag" in string vor dem Ausführen dieses regulären Ausdruck zu testen, aber ..

Warum erfasst der Originalregex nur das letzte Vorkommen und was muss geändert werden, damit es wie beabsichtigt funktioniert?

+0

Die wöchentliche Frage "wie html/xml mit Regex zu parsen" ... Verwenden Sie einen XML-Parser. Versuchen Sie nicht, einen regulären Ausdruck * in einer Sprache zu verwenden, die nicht regulär ist. – DeepSpace

+0

Sie haben Recht, die Frage ist wirklich über Regex, nicht XML. – handle

+2

So funktioniert Regex. Es erfasst nur das letzte Vorkommen. Sie können keine beliebige Anzahl von Vorkommen mit Regex erfassen. Schreiben Sie eine Schleife, um die Regex mehrfach anzuwenden, oder verwenden Sie einen XML-Parser. –

Antwort

3

So funktioniert Regex: Sie haben eine Erfassungsgruppe definiert, daher gibt es nur eine Erfassungsgruppe. Wenn es zuerst etwas erfasst und dann eine andere Sache erfasst, wird das erste erfasste Objekt ersetzt. Deshalb erhalten Sie nur das zuletzt aufgenommene Objekt.
Es gibt keine Lösung für die, die ich kenne ...

0

Von der documentation Suche wird nur ein Vorkommen zurückgegeben. Die findAll-Methode gibt alle Vorkommen in der Liste zurück. Das müssen Sie verwenden, wie in Ihrem zweiten Beispiel.

+0

Genau, aber ich brauche nur ein Vorkommen: Das Muster sollte mit _whole string_ übereinstimmen, allerdings mit mehreren Wiederholungen einer Gruppe. 'findall' gibt auch nur das letzte Spiel zurück. – handle

+0

Das Muster _does_ stimmt mit der ganzen Zeichenfolge _with_ repetitions der Gruppe überein, nur das erzeugt leider nicht mehrere Match-Gruppen. – handle

+0

Worauf zielen Sie? Willst du nur ein Ereignis oder alle von ihnen? Und was ist falsch im zweiten Beispiel? Ich weiß nicht, warum du

Verwandte Themen