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
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
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.
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...
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.
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.
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]: