Zahlenbereiche matchen mit re

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
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
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
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

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
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
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

joe schrieb:
Fast. "0" oder "00" wird noch erkannt.
Fast. "00" ja, '0' nein :wink:

Helmut
joe

helmut hat geschrieben:Fast. "00" ja, '0' nein :wink:
Stimmt. Und wenn der zahlenstring eh "nummerisch" erzeugt wurde, kann es ein "00" oder "000" eh nicht geben. Dann passt dein regexp wieder.
joe
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
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
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

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.
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
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
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

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)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 :x
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten