Seite 1 von 1
Zahlenbereiche matchen mit re
Verfasst: Dienstag 13. Dezember 2005, 10:05
von movies1978
Hallo Leute,
ich will einen Zahlenbereich von 1-4096 prüfen, aber alle meine Ansätzeverlaufen im Sand.
erster Versuch war:
re.match('[1-4096]','4097') <--- sagt leider 4079 ist auch drin
zweiter Versuch
re.match('[1,2,3,4]?\d?\d?\d?','4444') <--- machted leider auch > 4096
Wenn einer ein Idee hat, dann würde ich mich über einen Tip freuen. Alternativ könnte ich es in eine Zahl umwandeln und dan prüfen, aber das würde ich gerne umgehen!
Mfg
Mathias
Re: Zahlenbereiche matchen mit re
Verfasst: Dienstag 13. Dezember 2005, 10:42
von joe
movies1978 hat geschrieben:re.match('[1-4096]','4097') <--- sagt leider 4079 ist auch drin
re.match('[1,2,3,4]?\d?\d?\d?','4444') <--- machted leider auch > 4096
Nüchterne diagnose: regexps hast du nicht ansatzweise verstanden. Statt z.B. [1-4096] hättest du auch [0-469] oder [3409126] schreiben können und statt [1,2,3,4] auch [1-4,] oder [4,123]. Also besser finger weg von regexps, zumal du hier damit eh nichts ausrichten könntest. Der umweg übers umwandeln ist der einzig gangbare.
joe
Verfasst: Dienstag 13. Dezember 2005, 11:22
von helmut
Hallo Gast,
der Diagnose von joe kann ich nur zustimmen.
Wenn Du es dennoch unbedingt über regex versuchen willst, müßte es so klappen:
Code: Alles auswählen
re_1_4095 = compile('^([1-9]|\d{2,3}|[1-3]\d\d\d|40[0-8]\d|409[0-5])$')
Gruss, Helmut
Verfasst: Dienstag 13. Dezember 2005, 11:37
von joe
Hi
helmut hat geschrieben:Wenn Du es dennoch unbedingt über regex versuchen willst, müßte es so klappen:
Fast. "0" oder "00" wird noch erkannt.
Das müßte gehen:
Code: Alles auswählen
re_1_4095 = re.compile('^([1-9]\d{0,2}|[1-3]\d\d\d|40[0-8]\d|409[0-5])$')
joe
Verfasst: Dienstag 13. Dezember 2005, 11:48
von helmut
joe schrieb:
Fast. "0" oder "00" wird noch erkannt.
Fast. "00" ja, '0' nein
Helmut
Verfasst: Dienstag 13. Dezember 2005, 11:55
von joe
helmut hat geschrieben:Fast. "00" ja, '0' nein
Stimmt. Und wenn der zahlenstring eh "nummerisch" erzeugt wurde, kann es ein "00" oder "000" eh nicht geben. Dann passt dein regexp wieder.
joe
danke
Verfasst: Dienstag 13. Dezember 2005, 12:37
von movies1978
Danke für die muntere Kritik an meinen Ausdrücken, von denen ich wußte das sie nicht gehen. Erst wollte ich mich aufregen über joe, aber dann dachte ich mir ist eh umsonst und kostet nur Nerven. Kritik ist ja meiner Ansicht nach was Positives.
Den Ausdruck wie ihn Helmut geschrieben hat und joe ihn verbessert hat habe ich gesucht. Mir ist die Idee mit den Alternativen nicht gekommen.
Danke euch beiden für die Antworten und Kritik (Werde mir Zeichenklassen [] nochmal zur Gemüte führen.).
Mfg
Mathias
Re: danke
Verfasst: Dienstag 13. Dezember 2005, 13:00
von joe
Hi!
movies1978 hat geschrieben: Erst wollte ich mich aufregen über joe, aber dann dachte ich mir ist eh umsonst und kostet nur Nerven. Kritik ist ja meiner Ansicht nach was Positives.
Deswegen auch
nüchterne diagnose. Das war nicht abkanzelnd gemeint, sondern als objektive, ungeschönte feststellung. Wenn du jetzt "Zeichenklasse" schreibst, bist du ja auf dem absolut richtigen weg. Nichts anderes befindet sich in den eckigen klammern, als eben zeichenklassen, also eine menge von zeichen, die an der aktuellen stelle erlaubt sein dürfen. Häufig sieht man auch sowas (gerade wieder in de.comp.lang.python): [a|b], ob wohl [ab] gemeint ist. Das | ist einfach nur ein Zeichen und keine oder-verknüpfung. Das führt zwar selten zu fehlern, weil die getesteten strings vielleicht seltenst das pipezeichen enthalten, aber wehe wenn...
joe
Verfasst: Dienstag 13. Dezember 2005, 13:09
von henning
Die Kritik galt nicht den regexp's an sich (und ich denke mal, schon gar nicht dir persönlich), sondern der Herangehensweise, und da eine Alternative vorgeschlagen wurde, nämlich den String umzuwandeln, war sie auch durchaus konstruktiv!
Ich führe die Alternative hier einmal aus, auch wenn ich natürlich jetz nicht weiß, inwiefern sie in deinem speziellen fall sinn macht:
Code: Alles auswählen
def is_in_0_4096(text):
"""Gebe True zurück, wenn text die Dezimaldarstellung einer
Zahl zwischen (einschließlich) 0 und (einschl.) 4096 ist.
"""
try:
n = int(text)
except ValueError, e: # text keine Zahl
return False
else:
return 0 <= n <= 4096
...sprich erstmal den String in einen Integer umwandeln und dann gucken, ob der im richtigen Zahlenbereich liegt. wenn du natürlich einen sehr komplexen regulären Ausdruck hast, innerhalb dessen du matchen willst, dürfte die hier bereits vorgeschlagene RegExp u.U. hilfreicher sein.
Verfasst: Dienstag 13. Dezember 2005, 13:09
von movies1978
War nur eine erste Reaktion, aber danke fürs klarstellen. Aber das eigene Ego ist meist doch erstmal wichtiger als Vernunft (bei mir). Nochmal danke für die Hilfe.
Mathias
Verfasst: Dienstag 13. Dezember 2005, 13:21
von Gast
@poweruser
Auch sehr schöne Methode zum festellen ob der Wert zwischen 1 und 4096 liegt. Paßt sehr gut zu meinem Beispiel.
Danke
Mathias
Verfasst: Dienstag 13. Dezember 2005, 19:30
von henning
Kein Problem, helfe gern
Btw: Mein Name ist Henning, "poweruser" ist nur eine Einstufung des Forums. Das kommt aber komischerweise öfter vor, dass das verwechselt wird, kann man das ausschalten oder zumindest etwas kleiner darstellen? (Das "poweruser" meine ich)
Verfasst: Mittwoch 14. Dezember 2005, 15:28
von Leonidas
henning hat geschrieben:Btw: Mein Name ist Henning, "poweruser" ist nur eine Einstufung des Forums. Das kommt aber komischerweise öfter vor, dass das verwechselt wird, kann man das ausschalten oder zumindest etwas kleiner darstellen? (Das "poweruser" meine ich)
Man könnte es abschalten, oder zumindest so umstrukturieren, dass es etwas sinnvoller wird. Jedoch habe ich solcherlei Verwechslungen eigentlich nur 2 oder 3 mal bis jetzt gesehen, dementsprechend klein ist die Priorität da was zu ändern, vor allem da wirklich wichtigere Dinge anstehen, die hoffentlich so schnell wie möglich über die Bühne gehen (*hoff*, *weiterhoff*, *immernochhoff*). Sorry