
Guten Abend, ich habe folgenden Regulären Ausdruck erstellt der mir alle Meta-Angaben aus einer HTML Datei extrahiert: a = re.compile(r"<.*[meta].+>",flags=re.I | re.U | re.S) Der Reguläre Ausdruck funktioniert in soweit das alle Meta-Angaben gefunden werden. Benutze ich jetzt a.findall(string) werden alle Meta Vorkommen zusammen in einem Index gespeichert Beispiel: meta = "<META http-equiv="Content-Type" content="text/html; charset=iso-8859-15"><meta name="robots" content="index, follow">" a.findall(meta) !!Ausgabe:!! ['<META http-equiv="Content-Type" content="text/html; charset=iso-8859-15"><meta name="robots" content="index, follow">'] Nach meinem Verständnis müßten es zwei Einträge in der Liste sein. Wo ist hier mein Denkfehler? Ich sage schon mal Danke im Voraus mfg Albert _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Albert Hermeling wrote:
Guten Abend,
ich habe folgenden Regulären Ausdruck erstellt der mir alle Meta-Angaben aus einer HTML Datei extrahiert:
a = re.compile(r"<.*[meta].+>",flags=re.I | re.U | re.S)
[...]
!!Ausgabe:!! ['<META http-equiv="Content-Type" content="text/html; charset=iso-8859-15"><meta name="robots" content="index, follow">']
Nach meinem Verständnis müßten es zwei Einträge in der Liste sein. Wo ist hier mein Denkfehler?
a = re.compile(r"<\s*[meta][^>]+>",flags=re.I | re.U | re.S) \s unsichtbare Zeichen ("whitespace" = space, tab, etc.). Etwas anderes sollte an dieser Stelle nicht vorkommen. [^>] alles, ausser ein > REs sind gierig. Mit deinem .+ sucht das Pattern weiter, bis zum allerletzten > in der Datei (also in der Praxis meistens das vom </html>). Falls in den Attribut-Werten der Meta-Tags ebenfalls > vorkommen können, dann wird die Sache etwas komplizierter, geht aber auch. -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Nach meinem Verständnis müßten es zwei Einträge in der Liste sein. Wo ist hier mein Denkfehler?
Auch wenn man das ganze damit hinbekommen kann: der Denkfehler ist, regulaere Ausdruecke zu benutzen. Das hier ist alles, was man braucht: --------------------- import sgmllib class MetaExtractor(sgmllib.SGMLParser): def start_meta(self, attributes): print attributes page = """ <html><header><META http-equiv="Content-Type" content="text/html; charset=iso-8859-15"><meta name="robots" content="index, follow"></header> <body></body></html> """ me = MetaExtractor() me.feed(page) me.close() -------------------- Und dein "da laeuft soooviel code"-Argument ist nicht schluessig: Mit dem Argument verzichtest du am besten ganz auf Python und schreibst C :) MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Am Montag, 28. Februar 2005 11:22 schrieb Diez B. Roggisch: Hallo Diez,
Nach meinem Verständnis müßten es zwei Einträge in der Liste sein. Wo ist hier mein Denkfehler?
Auch wenn man das ganze damit hinbekommen kann: der Denkfehler ist, regulaere Ausdruecke zu benutzen. Das hier ist alles, was man braucht: Jetzt machst Du mich ein bißchen Neugierig, wo liegt den da mein Denkfehler? Im Modul sgmllib werden schließlich auch reguläre Ausdrücke verwendet zwar nicht so speziel wie meine, aber trotzdem sind es reguläre Ausdrücke!
--------------------- import sgmllib
class MetaExtractor(sgmllib.SGMLParser):
def start_meta(self, attributes): print attributes
Und dein "da laeuft soooviel code"-Argument ist nicht schluessig: Mit dem Argument verzichtest du am besten ganz auf Python und schreibst C :) Warum? Ich wollte zuerst das ganze mit der sgmllib machen, stellte aber bei der Umsetzung fest, das der meiste Code der dort ausgeführt wird, nichts zur konkreten Lösung meines Problems beiträgt. Außerdem, Deine Lösung braucht 11 mal mehr Zeit als meine :-)) gemessen mit den Python profiler und meine Lösung kann man sicherlich noch optimieren :-)).
mfg Albert PS. Gemsen wurde die Geschwindigkeit beider Skripte auf einem Celeron 1300 mit 256 MB Speicher unter Linux. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Jetzt machst Du mich ein bißchen Neugierig, wo liegt den da mein Denkfehler? Im Modul sgmllib werden schließlich auch reguläre Ausdrücke verwendet zwar nicht so speziel wie meine, aber trotzdem sind es reguläre Ausdrücke!
Reguläre Ausdrücke sind nicht per se böse, und auch nach wie vor ein probates Mittel in der Syntaxanalyse. Aber sgm/xml sind sprachen, die über sogenannte kontextfreie Grammatiken definiert werden, und nicht über die der wesentlich weniger mächtigen der regulären Grammatiken - die ja die Basis der regulären Ausdrücke bilden. Es wird daher _immer_ Fälle geben, die sich mit regulären Ausdrücken alleine nicht lösen lassen. Dann schreibt man entweder "irgendwas" selbst - oder bemüht eben einen der bereits existierenden parser. Und da meistens früher oder später bei der Entwicklung die Anforderungen steigen _und_ in diesem konkreten Fall die Einfachheit der sgmllib Lösung ja wohl kaum zu unterbieten ist (letztlich 3 Zeilen für eine überladenen Klasse, und keine Rückfragen hier, weil reguläre Ausdrücke sich nicht so verhalten haben, wie du dir das gewünscht hast) sollte man eben einfach das richtige Tool für den Job nehmen.
Warum? Ich wollte zuerst das ganze mit der sgmllib machen, stellte aber bei der Umsetzung fest, das der meiste Code der dort ausgeführt wird, nichts zur konkreten Lösung meines Problems beiträgt. Außerdem, Deine Lösung braucht 11 mal mehr Zeit als meine :-)) gemessen mit den Python profiler und meine Lösung kann man sicherlich noch optimieren :-)).
Das ist eben der 2te Denkfehler. Verfrühte Optimierung. Solange die Sache einfach und ausreichend schnell läuft, muss man sich da auch keinen Kopp machen. Und _wenn_ die performance kritisch ist, könnte es ebensogut sein das eine C-basierte Lösung schneller ist - warum dann überhaupt python? Weil die wesentlich wichtigere und teurere Entwicklungszeit kürzer ist! Abgesehen davon, das ohne Code und Daten deine Aussagen nicht verifizierbar sind. Sicherlich ist der sgmllib-parser per se langsamer (weil deutlich mächtiger, und nicht in C geschrieben wie die regexp-libs). Aber hast du zB die Parsierung deiner Eingabe zeilenweise vorgenommen und abgebrochen nachdem das body-open-tag auftauchte? Damit wäre dann der ganz Rest weggefallen, und ich denke das würde einiges an Performance bringen. Aber wie schon gesagt, die Diskussion ist nicht zielführend - es gibt meistens keinen Grund das zu oaptimieren.
PS. Gemsen wurde die Geschwindigkeit beider Skripte auf einem Celeron 1300 mit 256 MB Speicher unter Linux.
Das ist völlig irrelevant - du hast ja weder code und Beispieldateien noch konkrete Laufzeiten gemeldet - die Ergebnisse wären auf einem c64 relativ gesehen auch so ausgefallen. Wenn der denn python laufen liesse... MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (3)
-
Albert Hermeling
-
Diez B. Roggisch
-
Georg Mischler