[Python-de] Reguläre Ausdrücke: wiederholte Gruppen mit non-greedy-Inhalt
Karl Pflästerer
sigurd at 12move.de
Don Mar 18 17:12:12 CET 2004
On 18 Mar 2004, Yves Forkl <- Y.Forkl at srz.de wrote:
> Ich habe ein kniffliges Problem mit Regulären Ausdrücken zu bieten:
> von einer beliebig wiederholbaren Gruppe mit non-greedy-Inhalt kommt
> nur die letzte Instanz ins Match object. Der Code...
> import re
> pat = re.compile( "(<.*?/>)+" )
> pat.search( "<a/><b/>" ).groups()
> ...liefert...
> ('<b/>',)
> ...obwohl er aus meiner Sicht ('<a/>','<b/>') liefern sollte. Das
Dann siehst du dies falsch.
[...]
Hier eine Alternative:
In [24]: pat = re.compile('(<.*?/>)')
In [25]: pat.findall('<a/><b/>')
Out[25]: ['<a/>', '<b/>']
In [26]: pat.finditer('<a/><b/>')
Out[26]: <callable-iterator object at 0xbb54cc>
Die richtige regexp und findall oder finditer sind deine Freunde.
> (Von der Verwendung von Modulen wie htmllib o.ä. zum Parsen von HTML
> mal abgesehen.)
Wenn jemand »<a <b/>/>« schreibt, dann knallt es natürlich mit der
simplen regexp.
Karl
--
"Programs must be written for people to read, and only incidentally
for machines to execute."
-- Abelson & Sussman, SICP (preface to the first edition)