Reguläre Ausdrücke: wiederholte Gruppen mit non-greedy-Inhalt
Hallo! 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 passiert nur bei Inhalt mit non-greedy-Operator; ohne wird natürlich alles nur eine einzige Gruppe. Aufzählen der Gruppen statt beliebig wiederholen geht zwar, ist aber natürlich bei variabler Zahl an Gruppen im String nicht praktikabel. Hat jemand eine Erklärung dafür? Oder einen Vorschlag, wie ich auf andere Weise alle so aufgebauten Gruppen in das Match object kriege? (Von der Verwendung von Modulen wie htmllib o.ä. zum Parsen von HTML mal abgesehen.) Mit besten Grüßen Yves Forkl -- Yves Forkl <Y.Forkl@srz.de> · Tel. 030 / 7 53 01 - 335 Satz-Rechen-Zentrum Berlin · http://www.srz.de/ - Firmengruppe BessCom · http://www.besscom.de/ - _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Am Thu, 18 Mar 2004 14:23:45 +0100 Schrieb Yves Forkl <Y.Forkl@srz.de>:
Hallo!
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 passiert nur bei Inhalt mit non-greedy-Operator; ohne wird natürlich alles nur eine einzige Gruppe. Aufzählen der Gruppen statt beliebig wiederholen geht zwar, ist aber natürlich bei variabler Zahl an Gruppen im String nicht praktikabel.
Hi Yves, pat.findall("<a/><b/>") ...liefert... ['<a/>', '<b/>'] Gruß Fritz _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
On 18 Mar 2004, Yves Forkl <- Y.Forkl@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) _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (3)
-
Fritz Cizmarov -
sigurd@12move.de -
Yves Forkl