[Python-de] logisches nicht bei RegEx

Stefan Schwarzer sschwarzer at sschwarzer.net
Fre Jun 27 19:43:03 EDT 2003


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