Seite 1 von 1

brauche hilfe zu einem regulaeren ausdruck

Verfasst: Freitag 19. September 2008, 20:57
von roschi
hallo!

und wieder einmal brauche ich eure hilfe! :)

ich brauche einen regulaeren ausdruck, der mir ein datum und eine zeitangabe zerpflueckt...

ich nutze fast nie regular expression, also verhaut mich nicht, wenn das hier voelliger schwachsinn ist (was ich leider befuerchte) :lol::

Code: Alles auswählen

pattern = "(%d%d).(%d%d).(%d%d%d%d) (%d%d):(%d%d)"
m = re.match(pattern, "19.09.2008 22:00")
was sagt ihr dazu? ich bekomme dabei immer None! woran kann das liegen? kann man den ausdruck noch verkuerzen?

mfg
roschi

Verfasst: Freitag 19. September 2008, 21:27
von BlackJack
'%d' matcht ein Prozentzeichen gefolgt von einem kleinen 'd'. '\\d' matcht eine Ziffer. :-)

Verfasst: Freitag 19. September 2008, 21:50
von roschi
danke!

:evil:

natuerlich! das hatte ich verwechselt. vielen, vielen dank! jetzt gehts einwandfrei.

mfg
roschi

Verfasst: Freitag 19. September 2008, 23:13
von Leonidas
Statt den \d zweimal oder viermal hintereinander kannst du auch \d{2} bzw \d{4} nutzen.

Verfasst: Samstag 20. September 2008, 08:29
von sea-live
Leonidas hat geschrieben:Statt den \d zweimal oder viermal hintereinander kannst du auch \d{2} bzw \d{4} nutzen.
bekommt er dadutch auch die Punkt,Doppelpunkt aufschlüsselung

gibt es hierfür \d{2} einen wiki docu beitrag

Verfasst: Samstag 20. September 2008, 08:43
von numerix
sea-live hat geschrieben:gibt es hierfür \d{2} einen wiki docu beitrag
Kannst du hier nachlesen: http://docs.python.org/lib/re-syntax.html

Verfasst: Samstag 20. September 2008, 08:47
von Leonidas
sea-live hat geschrieben:
Leonidas hat geschrieben:Statt den \d zweimal oder viermal hintereinander kannst du auch \d{2} bzw \d{4} nutzen.
bekommt er dadutch auch die Punkt,Doppelpunkt aufschlüsselung
Was? Ich nehme mal an, dass du meinst ob man mit \d{2} auch die Punkte und Doppelpunkte richtig match. Nein, {2} bedeutet nur, dass das vorhergehende zweimal hintereinander gematcht werden muss, also werden aus "Ziffer zwischen 0 und 9" einfach zwei mal "Ziffer zwischen 0 und 9".
sea-live hat geschrieben:gibt es hierfür \d{2} einen wiki docu beitrag
Wiki-Doku.. was? Ich nehme mal an, dass du fragst ob das dokumentiert ist. Ja ist es, einmal in der Modul-Dokumentation und einmal im HOWTO.

Verfasst: Samstag 20. September 2008, 09:06
von roschi
vielen dank fuer die vereinfachte syntax!

ich habe das jetzt in meinem programm (ein kleiner terminplaner) eingebaut. wenn er fertig ist kann ich ihn ja auch ins Showvcase-Forum stellen.

so, ich werde mich sicherlich bald mal wieder melden. :)

schoenes wochenende noch euch allen!

mfg
roschi

Re: brauche hilfe zu einem regulaeren ausdruck

Verfasst: Samstag 20. September 2008, 09:28
von jens
roschi hat geschrieben:

Code: Alles auswählen

pattern = "(%d%d).(%d%d).(%d%d%d%d) (%d%d):(%d%d)"
m = re.match(pattern, "19.09.2008 22:00")
Dafür würde ich nicht re nehmen, sondern es so in datetime umwandeln:

Code: Alles auswählen

import datetime, time

date_string = "19.09.2008 22:00"
format="%d.%m.%Y %H:%M"

# Python ab 2.5
#dt = datetime.strptime(date_string, format)

# Python bis 2.5
struct_time = time.strptime(date_string, format)
dt = datetime.datetime(*struct_time[:6])

print dt
siehe:
http://docs.python.org/dev/library/date ... e.strptime
Format syntax: http://docs.python.org/dev/library/time ... e.strftime

Verfasst: Samstag 20. September 2008, 11:16
von roschi
nicht schlecht, aber:
>>> import datetime, time
>>> date_string = "19.09.2008 22:00"
>>> format="%d.%m.%Y %H:%M"
>>> dt = datetime.strptime(date_string, format)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'strptime'
ich habe aber python 2.5.1!
da muesste das doch eigendlich gehen, oder?

naja, am ende sollte da ein tuple herauskommen. daher ist das mit regular expression gar nicht mal so schlecht. sonst muesste ich es ja erst wieder konvertieren. :)

mfg
roschi

Verfasst: Samstag 20. September 2008, 11:21
von jens
Mein Fehler. So sollte es gehen:

Code: Alles auswählen

dt = datetime.datetime.strptime(date_string, format)
Raus kommt nicht ein Tupel, so wird es nur angezeigt. Es ist ein datetime Objekt. Daraus kannst du u.a. jede String Form mit strftime generieren:
http://docs.python.org/dev/library/date ... e.strftime

Mit datetime Objekten kann man ansonsten eine Menge anstellen. Was brauchst du denn hinterher?

Verfasst: Samstag 20. September 2008, 11:33
von roschi
wunderbar, so klappts!

ich brauche am ende die sekunden seit 1970. bisher mache ich mache das jetzt so:

Code: Alles auswählen

import datetime, time
date_string = "19.09.2008 22:00"
format="%d.%m.%Y %H:%M"
dt = datetime.datetime.strptime(date_string, format)
seconds = time.mktime(dt.timetuple())
so werde ich es wahrscheinlich auch beibehalten.

nochmal ein grosses dankeschoen!

mfg
roschi

Verfasst: Mittwoch 24. September 2008, 18:24
von JanDMC
Für alle die hier in diesem Thread landen, es gibt ein Programm das heißt "RegexCoach", damit kann man den gewünschten Text eingeben und herumprobieren um sich seine Regex zusammen zu basteln


mfg

Verfasst: Mittwoch 24. September 2008, 19:50
von Hyperion
Ich mag kodos :-) Gibt aber vermutlich ettliche solcher Tools!

Verfasst: Donnerstag 25. September 2008, 09:45
von snakeseven
Hi Roschi,
mir hat das hier sehr geholfen:

http://www.galileocomputing.de/openbook ... 64481427d7

Gruß, Seven

Verfasst: Sonntag 28. September 2008, 13:25
von roschi
@snakeseven:
ja, das kapitel hab ich mir danach auch schon mal durchgelesen. aber danke fuer den tipp. ist mir gleich eingefallen, nachdem ich den letzten post schrieb. :)

@Hyperion & @JanDMC:
oh, die tools werde ich mir mal anschauen. danke fuer den hinweis!

mfg
roschi

Verfasst: Sonntag 28. September 2008, 13:26
von roschi
so, ich schreib das mal noch mit in diesen thread rein.
es passt ja gewisser maßen dazu:
---------------------------------------------------------------------------------
kann mir jemand sagen, wie mein pattern aussehen muss, damit ich z.B. aus:

Code: Alles auswählen

[SETTINGS]
lenght = 80
height = 40
ein solches tuple/liste bekomme?

Code: Alles auswählen

('lenght = 80', 'height = 40')
ich denke, mir kann da jemand helfen, und hoffe auf eine schnelle antwort. :)

mfg
roschi

Verfasst: Sonntag 28. September 2008, 14:03
von Leonidas

Code: Alles auswählen

re.findall(r'^\w* = \d*$', s, re.MULTILINE)
Wobei es an dieser Stelle sinnvoller wäre, den INI-Parser aus der Stdlib zu verwenden.

Verfasst: Sonntag 28. September 2008, 14:11
von roschi
@leonidas:
vielen dank!
auch wenn ich das pattern MOMENTAN noch nicht verstehe :)

ich wollte meinen nehmen, weil ich mir den selber gestalten kann.
mein parser soll aehnlich wie 'configobj' werden. aber 'configobj' ist so groß und umfangreich!

naja, was solls, ich kann mich erst am donnerstag wieder melden.
bis dahin: viel spaß noch in der woche!

mfg
roschi

Verfasst: Sonntag 28. September 2008, 14:57
von Leonidas
roschi hat geschrieben:auch wenn ich das pattern MOMENTAN noch nicht verstehe :)
Ist ganz einfach. Zuerst wird ein Zeilenanfang gematcht (^), danach kommen so viele Buchstaben (\w) wie möglich (*), gefolgt von einem Leerzeichen, einem Ist-gleich-Zeichen und noch einem Leerzeichen, danach so viele Zahlen (\d) wie möglich (*), gefolgt von einem Zeilenende.

Das gibt natürlich ein Problem mit den Whitespaces, wenn es nicht exakt so viele gibt, wie der reguläre Ausdruck erfordert, somit wäre ein regulärer Ausdruck der alles richtig matcht komplizierter. Daher nimmt man für so etwas dann richtige Parser.