regular expressions anfängerfrage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
geogre
User
Beiträge: 41
Registriert: Mittwoch 20. April 2005, 13:26

hallo,

ich bin gerade auf ein problem gestossen, welches mich zum ersten mal auf re gebracht hat. leider habe ich etwas in büchern und hier im forum und anderen websites gelesen und kriege irgendwie den einstieg nicht.

ich möchte aus einer mail im txt format die ich eingelesen habe mit readlines aus der zeile die das datum enthält eben jenes herausfiltern um es umzuformatieren um letztlich die datei umbenennen zu können.

in der datei gibt es z.b. die zeile:

Datum: Mon, 18 Feb 2008 22:51:11 +0100

daraus möchte ich '18 Feb 2008' heraushaben um daraus 2008-02-18 zu machen. da ich nicht genau weiss wo es steht, ist meine idee, die stelle zu finden an der

ttt, ii ttt iiii ii:ii:ii

vorkommt, wobei i für eine ziffer, t für einen buchstaben, komma für komma und leerzeichen für leerzeichen steht (klar).

kann mir jemand erklären, wie und ob das mit re geht? das wäre super :) danke schonmal für tipps und beispiele.

ps: ich hab schon viel gesucht und gelesen, aber wie gesagt ich hab noch nicht den grundsätzlichen einstieg in diese mustererkennung geschafft und verstanden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ja, das geht!

Also ich würde Dir schon empfehle mal das Python Howto dazu zu lesen und versuchen das durchzuarbeiten.

Dazu kann ich Dir das Tool "Kodos" empfehlen, mit dem man schnell mal RegExps testen kann!

Ich bin mir sicher, dass Du das kapieren wirst und Dich da langsam rantastest!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ist es nicht sinnvoller erstmal mit ``time.strptime()`` versuchen den ganzen String zu parsen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

geogre hat geschrieben: ttt, ii ttt iiii ii:ii:ii
als RegExp:

Code: Alles auswählen

re.compile(r"[A-Za-z]{3}, \d{2} [A-Za-z]{3} \d{4} \d\d:\d\d:\d\d")
BlackJack

Wieso `re`?

Code: Alles auswählen

MONTH_ABBR = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
              'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
DATE_PREFIX = 'Datum: '

line = 'Datum: Mon, 18 Feb 2008 22:51:11 +0100'

if line.startswith(DATE_PREFIX):
    day, month, year = line.split()[2:5]
    assert len(year) == 4 and year.isdigit()
    month = MONTH_ABBR.index(month) + 1
    date = '%s-%02d-%02d' % (year, month, int(day))
    print date
lunar

Man munkelt, dass auch dateutil.parser ganz gut geeignet wäre ;)
geogre
User
Beiträge: 41
Registriert: Mittwoch 20. April 2005, 13:26

wow!!
vielen dank für die schnellen antworten!!!

@hyperion: das howto hat mich überfordert, kodos habe ich ausprobiert - super als lernhilfe, insbesondere mit dem re von audax

@leonidas: super idee, ich war allerdings davon ausgegenagen, nicht zu wissen an welcher stelle im string das datum vorkommt. bei genauer betrachtung ist es allerdings immer die selbe. vielleicht mach' ich es so.

@audax: danke für das beispiel! mit kodos habe ich es ausprobiert und die syntax natürlich sofort verstanden, allerdings habe ich es nicht in mein programm integrieren können, so dass nachher tag=18, monat=2 und jahr=2008 dabei herauskommt. brett vorm kopf :)

@blackjack: danke für den ganzen code! sehr edel, man merkt doch gleich wer alles häufiger mit python arbeitet als ich ;)... hab ich auch verstanden, bis auf assert - was macht das?! letztendlich macht der code wohl dasselbe wie strptime, oder?

wie es aussieht komme ich damit erstmal zurecht, ich wollte gerne etwas haben was garantiert in jeder zeile das datum findet, egal wo es steht (wenn eins da ist, ansonsten eine fehlermeldung) und auch wenn nicht 'datum: ' davor steht.

ich hab gesehen, dass das jahr manchmal nur 2stellig ist und der tag dafür manchmal nur einstellig... das macht es nicht gerade einfacher. ich schätze dass strptime mit einem 2-stelligen jahr '08' nichts anfangen kann, oder?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

geogre hat geschrieben:hab ich auch verstanden, bis auf assert - was macht das?!
Es wird einen AssertionError wenn die Bedingung nicht erfüllt ist. Äquivalent zu diesem Code:

Code: Alles auswählen

if not bedingung: raise AssertionError()
Zuletzt geändert von Leonidas am Sonntag 24. Februar 2008, 10:05, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
geogre
User
Beiträge: 41
Registriert: Mittwoch 20. April 2005, 13:26

vielen dank für all eure hilfe. ich habe mein kleines projekt soweit fertiggestellt, dass ich zufrieden bin, auch wenn ein *echter* programmierer möglicherweise die hände über dem kopf zusammenschlüge.

es ging darum mails aus thunderbird als .txt zu exportieren, die ich nie mehr brauche, aber in einem projektordner archivieren will. das macht ein nettes kleines tb-addon sehr gut, allerdings sind die dateinamen immer nur der betreff und damit z.b. nicht nach datum sortierbar und das wollte ich automatisch vorne im dateinamen haben.

ich habe den code auf

http://sourceforge.net/projects/xmr/

hochgeladen, vielleicht braucht ja nochmal jemand soetwas. falls das hier nochmal jemand liest... eine macke habe ich nicht gelöst, die zeichencodierung. umlaute im namen werden bei der umbenennaktion verhunzt. war mir erstmal egal, da es nicht viele sind, aber vielleicht hat ja noch jemand eine idee dazu?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vielleicht wäre es ja sinnvoller die Mails in ein interoperables Format wie mbox oder Maildir(++) zu exportieren, damit auch andere Programme damit was anfangen können?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
geogre
User
Beiträge: 41
Registriert: Mittwoch 20. April 2005, 13:26

kann sein... aber ich persönlich wollte es nicht mailmäßig interoperabel, sondern für immer aus meinem mailprogramm raus haben, als richtig interoperable textdatei zum archivieren und dann in 5 oder 10 jahren löschen :)

und das macht das addon 'ImportExportTools' ganz super. nur die benennung der mails ist blöd, daher das kleine programm xmr.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

geogre hat geschrieben:kann sein... aber ich persönlich wollte es nicht mailmäßig interoperabel, sondern für immer aus meinem mailprogramm raus haben, als richtig interoperable textdatei zum archivieren und dann in 5 oder 10 jahren löschen :)
Maildir(++) ist richtig interoperabel, es sind ja im großen und ganzen nur Textdateien + etwas Kontrollinformationen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
geogre
User
Beiträge: 41
Registriert: Mittwoch 20. April 2005, 13:26

ok... also, das verwendete export-tool produziert halt einfach txt-dateien und ich wollte sie nur (für mich) sinnvoll benannt haben, damit ich sie sortieren oder zuordnen kann. maildir(++) kenne ich nicht und wollte wie gesagt auch die datei selbst gar nicht ändern... danke nochmal für alle antworten.
Antworten