Nur Bichstaben oder Zahlen als Eingabe zulassen

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
SpyHRO65
User
Beiträge: 8
Registriert: Montag 22. April 2013, 15:59

Moin Moin,

Ich soll für die Uni ein Programm schreiben, welches überprüft ob die Eingabe eine zulässige kanadische plz darstellt. Die PLZ sehen so aus:

A0B 1C2

D3E 4F5

USW.

Ich weiß jetzt nicht genau wie ich Python zu sagen habe, dass er nur Buchstaben bzw Zahlen für die jeweilige Stelle der PLZ als Eingabe zulassen soll.

Wäre Super, wenn mir da jemand auf die Sprünge helfen könnte :)
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

na dann helf ich mal ein bisschen auf die Sprünge mit:
http://docs.python.org/2.7/library/stdt ... ng-methods

edit:
etwas fortgeschrittener mit Regex:
http://docs.python.org/2.7/library/re.h ... ight=re#re
krisjugisto
User
Beiträge: 4
Registriert: Freitag 26. April 2013, 09:50

Mach es, wie mcdwerner schon vorschlug, mit regulären Ausdrücken. Aus dem Stand würde ich sagen, du müsstest einfach mal prüfen, ob dieser Ausdruck

Code: Alles auswählen

^[\d\w]{3} [\d\w]{3}$
Treffer ausspuckt.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@krisjugisto: Der reguläre Ausdruck ist natürlich noch zu allgemein.

@SpyHRO65: Aufgaben fallen normalerweise nicht so vom Himmel. Wahrscheinlich hast Du in Deinen Unterlagen schon die nötigen Konstrukte stehen (String-Indizierung, If-Abfragen, usw.).
Was hast Du schon probiert?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sirius3 hat geschrieben:@SpyHRO65: Aufgaben fallen normalerweise nicht so vom Himmel. Wahrscheinlich hast Du in Deinen Unterlagen schon die nötigen Konstrukte stehen (String-Indizierung, If-Abfragen, usw.).
Was hast Du schon probiert?
Es kann gut sein, dass das bisherige Wissen so aussieht, dass die Uni keinen regulären Ausdruck sondern etwas simpleres haben will.

Code: Alles auswählen

if not 'D3E 4F5'[0].isalpha():
    print('falshc')
Daher ist die Frage "Was hast du probiert?" (plus die Frage "Welche Python-Sprachelemente darfst du verwenden?") entscheidend.
BlackJack

Code: Alles auswählen

from functools import partial
from itertools import izip
from operator import contains, eq as equals
from string import digits, uppercase


is_decimal_digit = partial(contains, set(digits))
is_postal_code_letter = partial(contains, set(uppercase) - set('DFIOQU'))
is_space = partial(equals, ' ')


def is_postal_code(code):
    checks = {
        'A': is_postal_code_letter,
        '0': is_decimal_digit,
        ' ': is_space,
    }
    return (
        len(code) == 7 and all(checks[p](c) for p, c in izip('A0A 0A0', code))
    )
:-)
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@BlackJack: die magic number 7 ist schlecht, :D
besser:

Code: Alles auswählen

from functools import partial
from itertools import izip_longest
from operator import contains
from string import digits, uppercase, whitespace
POSTAL_CODE_CHECKS = {
    '0': partial(contains, set(digits)),
    'A': partial(contains, set(uppercase) - set('DFIOQU')),
    ' ': partial(contains, set(whitespace)),
}

def is_postal_code(code):
    return all(POSTAL_CODE_CHECKS[p](c) for p, c in izip_longest('A0A 0A0', code, fillvalue=' '))
BlackJack

@Sirius3: Ich wollte dem OP halt nicht gleich die perfekte Lösung liefern. ;-)

Edit: Wobei `string.whitespace` auch Tabs und Zeilenumbruch/-ende enthält. Da würde ich bei ' ' bleiben.
Antworten