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?
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
Sie haben Recht, die Frage ist wirklich über Regex, nicht XML. – handle
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. –