Seite 1 von 1

exakte Länge mit RegEx feststellen

Verfasst: Montag 4. Januar 2010, 14:49
von noisefloor
Hallo,

ich habe eine String mit variabler Länge und ohne Whitepsaces, bei dem ich testen möchte, ob er mit exakt vier Zahl aufhört.

Mit

Code: Alles auswählen

re.match('\d{4}$',string)
funktioniert es nicht, weil das auf 'abcd01234' genau so passt wie auf 'abcd012345'.

Gruß, noisefloor

Verfasst: Montag 4. Januar 2010, 14:52
von Hyperion
Dann sag dem RegExp, dass er vor den Zahlen nur Buchstaben akzeptieren soll ;-)

Verfasst: Montag 4. Januar 2010, 15:15
von jbs
Besser nichtzahl:

Code: Alles auswählen

re.match('\D?\d{4}$',string)

Verfasst: Montag 4. Januar 2010, 16:19
von HWK
Das dürfte auch nicht richtig funktionieren, da die Regex nur Strings der Länge 4 und 5 matcht.

Code: Alles auswählen

>>> print re.match('\D?\d{4}$', 'ab1234')
None
Mein Vorschlag:

Code: Alles auswählen

>>> reg = re.compile('(?:^|\D)(\d{4}$)')
>>> reg.search('ab1234').group(1)
'1234'
>>> print reg.search('ab12345')
None
MfG
HWK

Verfasst: Montag 4. Januar 2010, 16:22
von noisefloor
Hallo,

irgendwas funktioniert nicht... und ich verstehe es nicht... :roll:

Code: Alles auswählen

text1 = 'abc12345'
text2 = 'abc1234'

re.match('\D?\d{4}$',text1)
#es wird kein match-Objekt zurückgegeben
re.match('\D?\d{4}$',text2)
#es wird kein match-Objekt zurückgegeben
re.search('\D?\d{4}$',text1)
#gibt ein match-Objekt
re.search('\D?\d{4}$',text2)
#gibt ein match-Objekt
EDIT: habe gerade erst das letzte Posting von HWK gelesen... werde ich mal probieren. :-)

Gruß, noisefloor

Verfasst: Montag 4. Januar 2010, 18:56
von problembär
Könntest auch eine eigene kleine Funktion ohne RegExes schreiben, in der Du die letzten vier Stellen jeweils mit ".isdigit()" überprüfst.

Gruß

Verfasst: Montag 4. Januar 2010, 19:06
von Hyperion
problembär hat geschrieben:Könntest auch eine eigene kleine Funktion ohne RegExes schreiben, in der Du die letzten vier Stellen jeweils mit ".isdigit()" überprüfst.

Gruß
Die davor sollen aber ja grad keine Digits sein!

Verfasst: Dienstag 5. Januar 2010, 08:47
von noisefloor
Hallo,
Könntest auch eine eigene kleine Funktion ohne RegExes schreiben,
Klar, kann man. Aber man muss ja mindestens 2x slicen, um das zu testen. Geht, ist aber nicht elegant. :wink:

Gruß, noisefloor

Verfasst: Dienstag 5. Januar 2010, 09:07
von BlackJack
@noisefloor: Einmal "slicen" reicht. Bei dem was vor den letzten vier Zeichen steht interessiert ja nur *ein* Zeichen -- dafür muss man nicht "slicen".

Verfasst: Dienstag 5. Januar 2010, 09:33
von snafu
Wenn man es in reinem Python schreiben möchte, dürfte dies alle Fälle abdecken:

Code: Alles auswählen

len(s) >= 4 and s[-4:].isdigit() and not s[-5:-4].isdigit()
Den letzten Slice mache ich so, weil er einen leeren String ergibt, wenn nur 4 Zeichen vorhanden sind und ich damit einen IndexError umgehe.

Verfasst: Dienstag 5. Januar 2010, 15:24
von sma

Code: Alles auswählen

import re

def s(s):
    return bool(re.search(r"(^|\D)\d{4}$", s))

assert s("1234")
assert not s("123")
assert not s("11234")

assert s("abc1234")
assert not s("abc123")
assert not s("abc11234")
Stefan

Verfasst: Dienstag 5. Januar 2010, 18:21
von HWK
@sma: Entspricht das nicht dem, was ich bereits vorgeschlagen habe?
MfG
HWK

Verfasst: Mittwoch 6. Januar 2010, 13:28
von sma
HWK hat geschrieben:@sma: Entspricht das nicht dem, was ich bereits vorgeschlagen habe?
Weitestgehend. Ich habe keine Gruppen. Manchmal schreibe ich Postings offline und/oder lese nicht alle Beiträge sorgfältig genug, um zu bemerken, dass mittlerweile mein Posting obsolete geworden ist. Und manchmal denke ich mir auch einfach, wenn ich's schon geschrieben habe, kann ich's auch posten. Das ist dann nicht als Kritik der vorherigen Beiträge zu werden.

Stefan

Verfasst: Mittwoch 6. Januar 2010, 15:44
von HWK
sma hat geschrieben:Ich habe keine Gruppen.
Doch: (^|\D).
Den Rest bei mir habe ich nur zugefügt, weil ich nicht wusste, ob der OP die letzten 4 Ziffern noch weiter verwenden will.
Ich habe Deinen Post auch nicht als Kritik aufgefasst, wollte Dich aber trotzdem auf das Überlesen meines Posts aufmerksam machen. :wink:
MfG
HWK

Verfasst: Donnerstag 7. Januar 2010, 00:18
von jbs
Was meint denn `(^|\D)`.
Also \D ist klar, aber ich verstehe hier denn Sinn von ^ gerade nicht.

Verfasst: Donnerstag 7. Januar 2010, 04:54
von Zap
jbs hat geschrieben:Was meint denn `(^|\D)`.
Also \D ist klar, aber ich verstehe hier denn Sinn von ^ gerade nicht.
Damit eine vierstellige Zahl am Anfang des Strings akzeptiert wird.

Code: Alles auswählen

In [2]: import re

In [3]: re.match(r"^\d{4}$", "1234")
Out[3]: <_sre.SRE_Match object at 0x012FC3A0>

In [4]: re.match(r"\D\d{4}$", "1234")
In [5]: