Seite 1 von 1

Nur Bichstaben oder Zahlen als Eingabe zulassen

Verfasst: Freitag 3. Mai 2013, 13:19
von SpyHRO65
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 :)

Re: Nur Bichstaben oder Zahlen als Eingabe zulassen

Verfasst: Freitag 3. Mai 2013, 13:25
von mcdwerner
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

Re: Nur Bichstaben oder Zahlen als Eingabe zulassen

Verfasst: Freitag 3. Mai 2013, 14:06
von krisjugisto
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.

Re: Nur Bichstaben oder Zahlen als Eingabe zulassen

Verfasst: Freitag 3. Mai 2013, 14:40
von Sirius3
@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?

Re: Nur Bichstaben oder Zahlen als Eingabe zulassen

Verfasst: Freitag 3. Mai 2013, 14:50
von /me
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.

Re: Nur Bichstaben oder Zahlen als Eingabe zulassen

Verfasst: Freitag 3. Mai 2013, 17:33
von 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))
    )
:-)

Re: Nur Bichstaben oder Zahlen als Eingabe zulassen

Verfasst: Freitag 3. Mai 2013, 18:15
von Sirius3
@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=' '))

Re: Nur Bichstaben oder Zahlen als Eingabe zulassen

Verfasst: Freitag 3. Mai 2013, 18:28
von 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.