[Python-de] Regulaere Ausdruecke in Python

Georg Mischler schorsch at schorsch.com
Thu Oct 4 12:31:12 EDT 2001


Gerhard Häring wrote:

> Albert Hermeling wrote:
>
> > Probiert habe ich es mit allerlei Versionen der Form hier:
> >
> > for i in lieste:
> >       var=sre.match("A-Z a-z 0-9 [.|?|!]",i)
> >       print var
> >
> > Resultat war bei allen Variationen "None" bei allen Indexwerten.
>
> Dein RegEx heisst:
> - Ein Zeichen von A-Z, gefolgt von
> - einem Leerzeichen, gefolgt von
> - einem Zeichen von a-z, gefolgt von
> - einem Leerzeichen, gefolgt von
> - einem Zeichen von 0-9, gefolgt von
> - einem Leerzeichen, gefolgt von
> - der letzte regex [.|?|!] ist m. E. falsch, du solltest die
>   Sonderzeichen ., ?, ! escapen


Da seid ihr gleich beide zusammen reingefallen...
Tatsaechlich hat die obige RE folgende Bedeutung:

- Der woertliche Ausdruck "A-Z a-z 0-9 " am Anfang des Strings.
- gefolgt von genau einem der Zeichen ., |, ?, !.

Warum?
Die "x-y" Schreibweise hat nur innerhalb von [] eine spezielle Bedeutung.
Innerhalb von [] folgen die gesuchten Zeichen ohne Trennfelder aufeinander.
Leerzeichen haben keine besondere Bedeutung (ausser mit dem Flag re.VERBOSE).
Wenn ein - oder ] innerhalb von [] gefunden werden soll, dann muss
es entweder mit einem vorhergehenden \ geschuetzt werden, oder am Anfang
(ggf. am Ende) der Liste stehen. Andere Sonderzeichen innerhalb von []
brauchen normalerweise nicht geschuetzt werden, ausser dass ^ nicht am Anfang
stehen sollte (sonst kehrt es das Muster um), und fuer eine echtes \ braucht
es natuerlich ebenfalls ein \\.

Wenn du nur die Existenz bestimmter Sonderzeichen in einem String
feststellen willst, dann funktioniert folgendes Prinzip:
  m = re.search("[.!?]", s)
oder besser:
  p = re.compile("[.!?]")
  m = p.search(s)
Danach enthaelt m entweder None oder ein re.MatchObjekt, welches auf
das erste Vorkommen eines der aufgefuehrten Sonderzeichen verweist.
Statt re.match() solltest du deshalb re.search() verwenden, weil dann
nicht nur Uebereinstimmungen am Anfang des Strings gefunden werden.
Wenn du Verweise auf alle Vorkommen in einem String brauchst, dann
gibt es dafuer noch spezialisiertere Funktionen wie re.findall().

Alles das ist in der Doku zum Standardmodul re sehr ausfuehrlich
beschrieben. Das Modul sre sollte schon seit ziemlich langer Zeit
nicht mehr verwendet werden, und ist nur noch aus Gruenden der
Rueckwaerts-Kompabilitaet ueberhaupt in der Bibliothek vorhanden.


Viel Spass!

-schorsch

-- 
Georg Mischler  --  simulations developer  --  schorsch at schorsch.com
+schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/




More information about the Python-de mailing list