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
Zahlenbereiche matchen mit re
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.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
joe
Hallo Gast,
der Diagnose von joe kann ich nur zustimmen.
Wenn Du es dennoch unbedingt über regex versuchen willst, müßte es so klappen:
Gruss, Helmut
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])$')
Hi
Das müßte gehen:
joe
Fast. "0" oder "00" wird noch erkannt.helmut hat geschrieben:Wenn Du es dennoch unbedingt über regex versuchen willst, müßte es so klappen:
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])$')
Stimmt. Und wenn der zahlenstring eh "nummerisch" erzeugt wurde, kann es ein "00" oder "000" eh nicht geben. Dann passt dein regexp wieder.helmut hat geschrieben:Fast. "00" ja, '0' nein
joe
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
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
Hi!
joe
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...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.
joe
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:
...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.
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
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
Mathias
@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
Auch sehr schöne Methode zum festellen ob der Wert zwischen 1 und 4096 liegt. Paßt sehr gut zu meinem Beispiel.
Danke
Mathias
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)
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)
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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*). Sorryhenning 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)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice