[Python-de] Noch mal RegEx :-((

Heike C. Zimmerer hcz at hczim.de
Die Jul 1 23:55:55 EDT 2003


Albert.Hermeling at t-online.de (Albert Hermeling) writes:

> der folgende vier Zahlenformate erkennt und zwar nur die:
>
> 1.	1234
> 2.	-1234
> 3.	1234,12
> 4.	-1234,12
>
> Es kommen also keine anderen Zeichen ausseer  Komma, Minus und Zahlen vor. Die 
> Anzahl der Zahlen vor und hinter den Komma kann schwanken. 

> test=sre.compile(r'[-]??\d+[,]??\d*')

Schon gut. Du kannst statt der "??" jeweils "?" schreiben, die
"non-greedy" Version ist witzlos, da eh nur ein Zeichen gematcht wird.
>
> test.match("1245")
> Liefert wie gewuenscht ein Treffer
>
> test.match("k124")
> Liefert wie gewuenscht kein Treffer
>
> aber 
>
> test.match("124k")
> liefert ein Treffer nicht gewuenscht.
>
> Wo ist den bloss der Denkfehler???

Du hast nirgends festgelegt, dass der Match bis zum Ende des Strings
gehen muss.  Ein String, dessen gültiger Teil früher aufhört, passt
ebenfalls.  Also nur ein "$" anhängen.  Im folgenden Beispiel habe ich
außerdem die einbuchstabigen Zeichenklassen ("[-]") durch den
Buchstaben selbst ersetzt und das "??" durch "?" (beides geht zwar,
ist aber unnötig kompliziert formuliert).  Ausserdem verwende ich re:

| >>> import re
| >>> r=re.compile(r'-?\d+,?\d*$')
| >>> r.match("12345,15").group()
| '12345,15'
| >>> r.match("12345,15k").group()
| Traceback (most recent call last):
|   File "<stdin>", line 1, in ?
| AttributeError: 'NoneType' object has no attribute 'group'

Deine Definition lässt noch einen Fall offen, der vielleicht
problematisch ist:

| >>> r.match("12345,").group()
| '12345,'

Falls dieser Fall auch ausgeschlossen werden soll:

| >>> r=re.compile(r'-?\d+(,\d+)?$')
| >>> r.match("1234,5").group()
| '1234,5'
| >>> r.match("1234,").group()
| Traceback (most recent call last):
|   File "<stdin>", line 1, in ?
| AttributeError: 'NoneType' object has no attribute 'group'

Gruß,

 Heike