[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)