Komma-separierte Liste von E-Mailadressen parsen

Folgendes Problem: Mit email.Utils.parseaddr() kann ich eine E-Mailadresse der Form "Joe Doe <joe@foo.com>" leicht in ihre Bestandteile (Displayname und Adresse) parsen. Wie kann ich eine Komma-separierte Liste solcher Adressen parsen? Beispiel: '"Hacker, J. Random" <random@hacker.net>, Joe Doe <joe@foo.com>' - man beachte das Komma innerhalb der doppelten Anführungszeichen. split(',') hilft also nichts. - der Displayname kann auch wegfallen - fehlt der Displayname können die spitzen Klammern entfallen Das eigentlich Problem besteht nur darin, die Liste entlang der Kommas zu spalten, sich aber nicht durch Kommas in Anführungszeichen beirren zu lassen. Den Rest erledigt parseaddr(). Weiß jemand, ob es dafür schon eine Lösung gibt? Chris _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo Christopher, genau für diese Aufgabe gibt es das csv-modul in der Standard-Library. Gruß Harald -- GHUM Harald Massa persuasion python postgresql Harald Armin Massa Reinsburgstraße 202b 70197 Stuttgart 0173/9409607 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Harald Armin Massa schrieb:
Hallo Christopher,
genau für diese Aufgabe gibt es das csv-modul in der Standard-Library.
Nope, das hilft leider nichts. Hatte ich auch zuerst dran gedacht und es dann aber für Overkill gehalten. Jetzt habe ich es mal getestet: ---> parseaddrlist.py <--- import csv import cStringIO import email.Utils def parseaddrlist(s): f = cStringIO.StringIO(s) reader = csv.reader(f, skipinitialspace=True) l = [] for addr in reader.next(): if addr.strip(): l.append(email.Utils.parseaddr(addr)) return l if __name__ == '__main__': al = '"Hacker, J. Random" <random@hacker.net>, Joe Doe <joe@foo.com>, ' + \ 'luser@dau.org' print parseaddrlist(al) ---> end <--- $ python parseaddrlist.py [('', 'Hacker'), ('Joe Doe', 'joe@foo.com'), ('', 'luser@dau.org')] Leider nicht ganz das, was ich wollte. Da csv die Quotes um "Hacker, J. Random" nicht erhält, scheitert parseaddr() :-( Chris _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Versuch mal das hier. Der Trick besteht darin, separierte Segmente aufzusammeln, bis die eine gültige Adresse ergeben. Fehlerbehandlung gibbet nich :) Diez text = 'Joe Doe <joe@foo.com>, "Hacker, J. Random" <random@hacker.net>, Joe Doe <joe@foo.com>' import email.Utils, sys text = text.strip() #if text[-1] != ",": # text = "%s," % text l = text.split(",") addr, l = l[0], l[1:] res = [] while l: name, mail = email.Utils.parseaddr(addr) if mail.find("@") == -1: addr = "%s,%s" % (addr, l[0]) l = l[1:] else: res.append((name, mail)) addr, l = l[0], l[1:] name, mail = email.Utils.parseaddr(addr) if mail.find("@") != -1: res.append((name, mail)) print res _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Diez B. Roggisch schrieb:
Versuch mal das hier.
Der Trick besteht darin, separierte Segmente aufzusammeln, bis die eine gültige Adresse ergeben.
[Beispiel abgeschnitten]
Danke! Ja, das würde für meine Zwecke funktionieren. Inzwischen habe ich aber selbst eine Funktion geschrieben, die einen String entsprechen aufsplittet. Diese Herangehensweise ist etwas länger als dein Code aber funkioniert auch mit Adressen, die kein '@' enthalten (z.B. lokale User, siehe testcase im angehängten Code). Chris PS. Ein anderer User hat die Verwendung von regular expressions empfohlen. Natürlich habe ich auch zuerst daran gedacht. Da es aber nicht nur darum geht, die eigentlichen Adressen herauszufiltern (das ist einfach: re.findall(r'<?(\S+?@\S+\.\w+)>?')), sondern auch den Displaynamen zu erhalten, stellen Kommas innerhalb von Quotes ein Problem dar. Damit können regular expressions nicht gut umgehen. Das theoretisch zu erklären, überlasse ich jemand anderem... _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (3)
-
Christopher Arndt
-
Diez B. Roggisch
-
Harald Armin Massa