[Python-de] logisches nicht bei RegEx

Georg Mischler schorsch at schorsch.com
Sam Jun 28 10:18:10 EDT 2003


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/