Probleme mit RegEX und Zahlen

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
JohannesGolf
User
Beiträge: 34
Registriert: Montag 10. März 2014, 09:27

Hallo Zusammen,

ich schreibe gerade, als Übung, an einem Programm mit den man Dezimale Zahlen in binär umrechnen kann und umdrehen.
Es geht alles soweit, nur will ich jetzt die eingaben "einschränken", dsh. das man wenn man von Binär in Dezimal umrechnen will NUR 0 oder 1 in der Zahl stehen darf.
Wie kann ich das jetzt am besten umsetzten? Ich will das es am Ende ,ungefähr, so laufen soll.
  • -"Gibt mir die Binärenummer zum umrechnen!"
    --user gibt Nummer ein (z.B. 1001001201)
    -soll die Nummer Prüfen (also nur 0 oder 1)
    ->ist eine andere Zahl als 0 oder 1 enthalten -> "NUR 0en oder 1er erlaubt. Bitte erneut eingeben"
    ->ist die Zahl OK wandle sie um (das geht schon)
Ich hätte an sowas in der Art gedacht: match number with [0-1]{1,}
Ich bedanke mich schon mal für eure Vorschläge oder Tipps.

Mit freundlichen Grüßen

JohannesGolf
BlackJack

@JohannesGolf: Die `int()`-Funktion löst beim umwandeln einen `ValueError` aus wenn da Zeichen enthalten sind die nicht zur Basis passen. Warum also etwas prüfen was beim Umwandeln sowieso schon geprüft wird?
JohannesGolf
User
Beiträge: 34
Registriert: Montag 10. März 2014, 09:27

BlackJack hat geschrieben:@JohannesGolf: Die `int()`-Funktion löst beim umwandeln einen `ValueError` aus wenn da Zeichen enthalten sind die nicht zur Basis passen. Warum also etwas prüfen was beim Umwandeln sowieso schon geprüft wird?

da ich ja in binär umwandeln will, sind andere Zahlen wie 2 - 9 "Falsch" (wie im Beispiel beschrieben) . ich will das wenn in dieser Variable nur 0 und 1 zugelassen sind. wenn i-was anderes darin vorkommt, soll eine neue Zahl eingegeben werden.
BlackJack

@JohannesGolf: Das habe ich schon verstanden. Nochmal: Wenn man `int()` eine Zeichenkette übergibt die andere Zeichen enthält als für die Basis die man angibt gültig sind, löst die Methode einen `ValueError` aus. Den fängt man ab, meckert mit dem Benutzer, und lässt ihn erneut einen Wert eingeben. Solange bis er's richtig macht, also am besten eine Endlosschleife die erst verlassen wird wenn die Eingabe stimmte.

Code: Alles auswählen

In [2]: int('10', 2)
Out[2]: 2

In [3]: int('120', 2)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-877d91ae376d> in <module>()
----> 1 int('120', 2)

ValueError: invalid literal for int() with base 2: '120'
Und das mit der Ausnahme würde ich auch bei einer eigenen Funktion für Umwandlungen die nicht mit `int()` gehen so machen, denn innerhalb dieser Funktion sollte man natürlich auch prüfen ob die Argumente sinnvolle Werte enthalten und entstprechen einen `ValueError` auslösen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@JohannesGolf: wenn du eine ValueError erhälst weißt du doch, dass die Zahl kein Binär war ;-)

Ansonsten brauchst du kein RegEx dafür, das geht auch ganz einfach mit Sets. Mach' aus der Binärzahl ein Set und vergleich es mit einem Vorgabeset.

Gruß, noisefloor
Zuletzt geändert von noisefloor am Donnerstag 15. Januar 2015, 13:37, insgesamt 1-mal geändert.
JohannesGolf
User
Beiträge: 34
Registriert: Montag 10. März 2014, 09:27

Danke
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Wenn du wirklich einen regulären Ausdruck verwenden möchtest, dann musst du überlegen was du haben willst.

Du möchtest den String von Anfang bis Ende durchsuchen, also brauchst du schon mal die passenden Anker (^, $). Dazwischen können dann beliebig viele Zeichen sein die 0 oder 1 sind. Das führt uns dann zu '^[01]+$'. Jetzt brauchst du nur noch mit re.search suchen und wenn es keinen Treffer gibt, entsprechend reagieren.

Ich würde aber tatsächlich einfach die Umwandlung mit int() versuchen und im Falle eines ValueError eine entsprechende Meldung bringen.
Antworten