
Hallo Mailingliste, ich haenge schon wieder bei den RegEx diesmal moechte ich einen String darauf ueberpruefen ob er Zahl, Datum oder alphanumerisch ist. Beispiel: datum="01.01.2003" keindatum="01-01.2003" zahl1="12345" zahl2="123,45" zahl3="-12345,12" keinezahl="ab1245,45" alphanumerisch="Alle Latin1 Zeichen gemischt" Mit RegEx ist es mir bis jetzt nicht gelungen. Versucht habe ich z. B folgendes: re.match("[0-9]*.[\-]*",keindatum) Der obige Code liefert ein Match Objekt. Mir ist klar warum ich ein Match Objekt bekomme, re.match findet ja die gesuchten Zeichen. Ich moechte aber kein Match Objekt bekommen wenn es kein Datum oder Zahl ist. Anders gesagt: wenn ein "Falsches" Zeichen drinn ist dann kein nicht Match Wie bekomme ich das hin? MfG Albert Hermeling _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Am Freitag, 27. Juni 2003 16:38 schrieb Albert Hermeling: Hallo Mailingliste,
ich haenge schon wieder bei den RegEx diesmal moechte ich einen String darauf ueberpruefen ob er Zahl, Datum oder alphanumerisch ist.
Na ja manchmal sieht man den Wald vor lauter Baeumen nicht. Ist doch einfach. Suche nicht nach dem was drin sein darf sondern nach dem was nicht :-)). Findet er dieses ist es kein Datum oder Zahl sondern alphanumerisch. Beispiel: keindatum="01-01.2003" re.match("[a-z]|[A-Z]|[,;:/-_ ?'`#']",keindatum) <_sre.SRE_Match object at 0x827f5d8> Das ist also kein Datum. Hat jemand eine bessere Loesung? MfG Albert Hermeling _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo Albert, Albert Hermeling wrote:
Am Freitag, 27. Juni 2003 16:38 schrieb Albert Hermeling: Na ja manchmal sieht man den Wald vor lauter Baeumen nicht. Ist doch einfach. Suche nicht nach dem was drin sein darf sondern nach dem was nicht :-)). Findet er dieses ist es kein Datum oder Zahl sondern alphanumerisch.
Beispiel:
keindatum="01-01.2003"
re.match("[a-z]|[A-Z]|[,;:/-_ ?'`#']",keindatum)
mein Vorschlag: match = re.search(r"^(\d\d?)\.(\d\d?)\.((?:\d){4})$", gueltiges_datum) if match is not None: tag, monat, jahr = match.groups() \d = Ziffer \d? = null oder eine Ziffer \d{4} = vier Ziffern (...) = Gruppe speichern (?:...) = gruppieren, aber nicht als Gruppe speichern Wichtig ist das r vor dem Pattern-String, sonst müsstest du alle Backslashes doppelt schreiben. z. B.
re.search(r"^(\d\d?)\.(\d\d?)\.((?:\d){4})$", "1.12.2003") <_sre.SRE_Match object at 0x8126700> tag, monat, jahr = _.groups() tag, monat, jahr ('1', '12', '2003')
Das Pattern erlaubt ein- oder zweistellige Tages- und Monatswerte; es prüft allerdings, ob ein unmögliches Datum vorliegt, bspw. 30.2.2003 . Viele Grüße Stefan _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Stefan Schwarzer wrote:
re.search(r"^(\d\d?)\.(\d\d?)\.((?:\d){4})$", "1.12.2003") <_sre.SRE_Match object at 0x8126700> tag, monat, jahr = _.groups() tag, monat, jahr ('1', '12', '2003')
Das Pattern erlaubt ein- oder zweistellige Tages- und Monatswerte; es prüft allerdings, ob ein unmögliches Datum vorliegt, bspw. 30.2.2003 .
ups, es sollte natürlich "allerdings _nicht_" heißen. Tschaui Stefan _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

On 27 Jun 2003, Albert Hermeling <- Albert.Hermeling@t-online.de wrote:
ich haenge schon wieder bei den RegEx diesmal moechte ich einen String darauf ueberpruefen ob er Zahl, Datum oder alphanumerisch ist.
Beispiel:
datum="01.01.2003"
keindatum="01-01.2003"
zahl1="12345"
zahl2="123,45"
zahl3="-12345,12"
keinezahl="ab1245,45"
alphanumerisch="Alle Latin1 Zeichen gemischt"
Mit RegEx ist es mir bis jetzt nicht gelungen.
(a) zum Datum: das Datum hat also immer die Form dd.mm.yyyy oder auch d.m.yyyy? o zum ersten Fall: sre.compile(r'\d{2}\.\d{2}\.\d{4}') o zum zweiten Fall: sre.compile(r'\d{1,2}\.\d{1,2}\.\d{4}') (b) Eine Zahl darf also Ziffern, Kommata und Vorzeichen enthalten. Meine Lösung sieht leider ein wenig kompliziert aus, aber ich weiß nicht, was alles bei dir vorkommen kann. sre.compile(r'(?:(?=\s)|^)[+-]?\d+,?\d*\b') Wegen des Vorzeichens funktioniert »\b« am Anfang nicht. (c) Alphanumerisch und ein wenig mehr. Meinst du damit alles was zwischen ASCII 33 und 255 kein ASCII mehr ich weiß) liegt? o sre.compile(r'[\x21-\xff]+') HTH Karl -- Der wahre Weltuntergang ist die Vernichtung des Geistes, der andere hängt von dem gleichgiltigen Versuch ab, ob nach der Vernichtung des Geistes noch eine Welt bestehen kann. Karl Kraus 'Untergang der Welt durch schwarze Magie' _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Albert.Hermeling@t-online.de (Albert Hermeling) writes:
Hallo Mailingliste,
ich haenge schon wieder bei den RegEx diesmal moechte ich einen String darauf ueberpruefen ob er Zahl, Datum oder alphanumerisch ist.
Regexs wurden ja schon mehrere vorgeschlagen. Du könntest auch einen anderen Weg einschlagen, der in Python besonders elegant geht: warum schaust Du nicht nach, ob sich mit dem Objekt das Gewünschte machen lässt und fängst die Exception ab? Ohne es genauer zu überprüfen, etwa so: try: time.strptime(s, "%d.%m.%Y") return("Datum") except ValueError: try: float(s) return("Zahl") except ValueError: : :
alphanumerisch="Alle Latin1 Zeichen gemischt"
Das musst Du genauer fassen. Zum einen sind Zahl und Datum eine Untermenge von Latin1, Du willst sie also wahrscheinlich vorher ausschließen. Zum anderen: falls Dein Input-Zeichensatz Latin1 ist, kannst Du ja gar keine anderen Zeichen erhalten. Falls Du mit Unicode arbeitest, hilft s.encode() und Abfangen der Exception. Vermutlich meinst Du aber einen Subset von Latin1. Da würde ich auch eine passende Regex für das einfachste halten. Gruß, Heike _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Am Samstag, 28. Juni 2003 00:57 schrieb Heike C. Zimmerer:
Albert.Hermeling@t-online.de (Albert Hermeling) writes:
Guten Morgen,
ich haenge schon wieder bei den RegEx diesmal moechte ich einen String darauf ueberpruefen ob er Zahl, Datum oder alphanumerisch ist.
Regexs wurden ja schon mehrere vorgeschlagen. Du könntest auch einen anderen Weg einschlagen, der in Python besonders elegant geht: warum schaust Du nicht nach, ob sich mit dem Objekt das Gewünschte machen lässt und fängst die Exception ab?
Auch ein Weg, nur der Gedanken eine Ausname zu erzeugen um ein String zu ueberpruefen gefaehlt mir nicht so recht.
Das musst Du genauer fassen. Stimmt, ich solte mal genau erklaeren um was es geht.
Ich schreibe gerade an ein Programm das aus Excel importierten csv Dateien Importdateien fuer ein Kostenrechnungsprogramm erstellen soll. Jede Zeile der Importdatei enthaelt durch Semikolon getrennte Zellen etwa in der Form: 1000;01.01.2003;-125,02;6000;Stuhl/1245;root Die erste Zelle enthaelt die Kostenstelle sie darf nur aus positiven ganzen Zahlen bestehen Die zweite Zelle enthaelt das Datum. Das Datum muss immer in der Form tt.mm.yyyy vorliegen. Die dritte und vierte Zelle enthalten Werte. Das Format entspricht das der positiven bzw. negativen reellen Zahlen. Wobei das Komma die ganzen Zahlen von den Dezimalzahlen abtrennt. Die letzten beiden Zellen enthalten den Kostentreager und den Bucher. Sie duerfen aus fast allen Zeichen bestehen die auch in einem Text vorkommen koennen. Die Zellen sollen bei der Erzeugung der Importdatei auf ihr Format ueberprueft werden. Die Ueberpruefung der Formate moechte ich gerne mit Regulaeren Ausdrucken machen da das am (so denke ich) Schnellsten geht. MfG Albert Hermeling _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Albert.Hermeling@t-online.de (Albert Hermeling) writes:
Am Samstag, 28. Juni 2003 00:57 schrieb Heike C. Zimmerer:
Regexs wurden ja schon mehrere vorgeschlagen. Du könntest auch einen anderen Weg einschlagen, der in Python besonders elegant geht: warum schaust Du nicht nach, ob sich mit dem Objekt das Gewünschte machen lässt und fängst die Exception ab?
Auch ein Weg, nur der Gedanken eine Ausname zu erzeugen um ein String zu ueberpruefen gefaehlt mir nicht so recht.
Wieso? Das ist der "Pythonic way". EAFP statt LBYL: http://octopus.cdut.edu.cn/~yf17/pythonnutshell/0596001886_pythonian-chp-6-s... Deine Aufgabe ist ein Grenzfall davon, da Du die Werte nicht weiter verarbeitest. (Der obige Link ist das Buch "Python in a Nutshell". Ich bin darüber gestolpert, als ich für dieses Posting nach "EAFP" gegooglet habe. Es liegt auf einem Server in China, die haben's wohl nicht so genau mit dem Copyright.)
Die letzten beiden Zellen enthalten den Kostentreager und den Bucher. Sie duerfen aus fast allen Zeichen bestehen die auch in einem Text vorkommen koennen.
Das klingt nach einer typischen Aufgabe für eine Regex. Die anderen - find ich - eher weniger. Gruß, Heike _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Am Samstag, 28. Juni 2003 12:36 schrieb Heike C. Zimmerer:
Albert.Hermeling@t-online.de (Albert Hermeling) writes:
Am Samstag, 28. Juni 2003 00:57 schrieb Heike C. Zimmerer:
Hallo Heike,
Regexs wurden ja schon mehrere vorgeschlagen. Du könntest auch einen anderen Weg einschlagen, der in Python besonders elegant geht: warum schaust Du nicht nach, ob sich mit dem Objekt das Gewünschte machen lässt und fängst die Exception ab?
Auch ein Weg, nur der Gedanken eine Ausname zu erzeugen um ein String zu ueberpruefen gefaehlt mir nicht so recht.
Wieso? Das ist der "Pythonic way". EAFP statt LBYL:
stimmt schon Dein Weg ist der "Pythonic way" ist er deshalb immer der bessere? Ich meine im meinem Fall nicht. Ich glaube das dein Code mehr Zeit braucht als Karl sein Vorschlag. Da ich mit grossen Dateien rechne ist die Schnelligkeit wichtig. Daher wird das Datum auch nicht auf "unmoegliches Datum" geprueft es wuerde einfach zu lange dauern. Ausserdem, das Kostenrechnungsprogramm ueberprueft beim Import die Daten ebenfalls. Mir geht es nur darum festzustellen ob die csv Datei richtig aufgebaut ist und dafür reicht eine Formatpruefung allemal aus. mfg Albert Hermeling _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Albert Hermeling wrote:
Heike C. Zimmerer schrieb:
Albert Hermeling writes:
Heike C. Zimmerer schrieb:
Regexs wurden ja schon mehrere vorgeschlagen. Du könntest auch einen anderen Weg einschlagen, der in Python besonders elegant geht: warum schaust Du nicht nach, ob sich mit dem Objekt das Gewünschte machen lässt und fängst die Exception ab?
Auch ein Weg, nur der Gedanken eine Ausname zu erzeugen um ein String zu ueberpruefen gefaehlt mir nicht so recht.
Wieso? Das ist der "Pythonic way". EAFP statt LBYL:
stimmt schon Dein Weg ist der "Pythonic way" ist er deshalb immer der bessere? Ich meine im meinem Fall nicht. Ich glaube das dein Code mehr Zeit braucht als Karl sein Vorschlag. Da ich mit grossen Dateien rechne ist die Schnelligkeit wichtig.
Die Exception braucht nur dann Zeit, wenn sie tatsaechlich ausgeloest wird. Erwartest du, dass die Mehrzahl deiner Eintraege Formatfehler aufweist? Gerade fuer deinen Fall, wenn im Normalfall alles gut geht, ist eine Test mit Exceptions die optimale Loesung, auch unter Performance-Kriterien. Wenn du sicher gehen willst, dann implementierst du am besten mehrere Varianten, und probierst aus, welche eine typische Datei am schnellsten verarbeiten. Alles andere ist erst mal Spekulation, auch wenn die Erfahrung zeigt, dass bei selten auftretenden Fehlern eine Fehlerbehandlung mit Exceptions normalerweise am effizientesten ist. Uebrigens, wenn du mit REs arbeitest, vergiss nicht deine Muster vorher (ausserhalb des loops) zu kompilieren! Hier demonstriert mit einem, das zumindest grob die zulaessigen Bereiche abcheckt: pats = ( '(0?[1-9]|[12][0-9]|3[[01])' # tag (0 - 31) '\.' '(0?[1-9]|1[012])' #monat (0 - 12) '\.' '(19[0-9]{2}|[2-9][0-9]{3})' # jahr (alles ab 1900) ) pat = re.compile(pats) def teste_datumsformat(s, pat=pat): if not pat.match(teststring): raise ValueError, 'Ungueltiges Datumsformat: "%s"' % s -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

Am Samstag, 28. Juni 2003 15:18 schrieb Georg Mischler:
Albert Hermeling wrote:
Heike C. Zimmerer schrieb:
Albert Hermeling writes:
Heike C. Zimmerer schrieb:
Hallo Georg
warum schaust Du nicht nach, ob sich mit dem Objekt das Gewünschte machen lässt und fängst die Exception ab?
Auch ein Weg, nur der Gedanken eine Ausname zu erzeugen um ein String zu ueberpruefen gefaehlt mir nicht so recht.
Wieso? Das ist der "Pythonic way". EAFP statt LBYL:
stimmt schon Dein Weg ist der "Pythonic way" ist er deshalb immer der bessere? Die Exception braucht nur dann Zeit, wenn sie tatsaechlich ausgeloest wird. Erwartest du, dass die Mehrzahl deiner Eintraege Formatfehler aufweist? Nein Genau das gegenteil.
Gerade fuer deinen Fall, wenn im Normalfall alles gut geht, ist eine Test mit Exceptions die optimale Loesung, auch unter Performance-Kriterien.
Hm von der Seite habe ich das noch nicht betrachtet so gesehen ist die Exceptions warscheinlich die bessere und auch schnelere Loesung. MfG Albert Hermeling _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

On Fri, Jun 27, 2003 at 04:38:04PM +0200, Albert Hermeling wrote:
Hallo Mailingliste,
ich haenge schon wieder bei den RegEx diesmal moechte ich einen String darauf ueberpruefen ob er Zahl, Datum oder alphanumerisch ist.
Beispiel:
zahl1="12345" zahl2="123,45" zahl3="-12345,12"
Das könnte man auch ohne RegEx machen: s="-4,5" s=s.replace(",", ".") try: s=float(s) except: print "keine Zahl" thomas PS: In der Regel ist es besser nicht mit floats zu arbeiten und integers zu verwenden. Geldbeträge als lieber in Cent bzw. hundertstel Cent berechnen. -- Thomas Guettler <guettli@thomas-guettler.de> http://www.thomas-guettler.de _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (6)
-
Albert.Hermeling@t-online.de
-
Georg Mischler
-
hcz@hczim.de
-
sigurd@12move.de
-
Stefan Schwarzer
-
Thomas Guettler