Sprawdzenie kodu pocztowego bez zastosowania metod z wyrazen reg.

0

Napisz aplikację Flaska, która poprosi użytkownika o wpisanie kodu pocztowego (na akcji GET "/"), a potem (na akcji POST "/") wyświetli informację:

  • Kod poprawny, jeżeli kod jest w poprawnym polskim formacie (00-001).
  • Kod niepoprawny, w przeciwnym wypadku
    Kod wysyłaj jako parametr code.
    Doszedlem do takiego etapu kiedy pojawia mi sie formularz, komunikat, po wpisaniu prawdlowego kodu pocztowego jest wszystko ok, ale jesli nieprawidlowy to juz nie.
from flask import Flask
from flask import request
app=Flask(__name__)
@app.route("/",methods=["GET","POST"])
def kod():
    komunikat="Podaj kod pocztowy"
    form=""" <form method="POST">
            <input type="text" name="code">
            <input type="submit" value="sprawdz">
            </form>
    """
    code=request.form.get("code")
    kom=""
    if code is not None:
        if len(code)==6 and ord('-') == 45:
            try:
                [int(x) for x in range(len(code))]
                kom = " kod prawidlowy"
            except TypeError:
                return str(False)
        else:
            kom = " kod nieprawidlowy"
    return f"{komunikat}{form}{kom}"
if __name__ == '__main__':
    app.run()
0

ord('-') == 45 mam w ifie, to nie spr? wywalam go pozniej bo jak mam przekonwertowac "-" na int?

A po co chcesz konwertować znak - na int? o.O i co to w ogóle ma według Ciebie sprawdzać?

code[2] == '-'

albo

code.index('-') == 2

ale nie

ord('-') == 45
0

Ok, tylko jeszcze nie wiem co zrobić by sprawdzić czy użytkownik podał liczby, a nie”mm-sss”

Jest funkcja wbudowana str.isdigit(), jest też funkacja all(iterable), jak już upewnisz się że masz myślnik na właściwej pozycji, to możesz przetestować pozostałe znaki:

del code[2] # usunąłeś myślnik, możesz też użyć np. code.pop(2)
digits_only = all(map(lambda letter: letter.isdigit(), code))
0

Możesz użyć fnmatch.fnmatch by sprawdzić dopasowanie wg globów

>>> import fnmatch
>>> fnmatch.fnmatch('00-001', '[0-9][0-9]-[0-9][0-9][0-9]')
True
>>> fnmatch.fnmatch('00-001d', '[0-9][0-9]-[0-9][0-9][0-9]')
False

Globy to nie regexy i obsługują

  • wiele znaków z *
  • jeden znak z ?
  • zakres z [a-z]
0

Zrobilem cos takiego i na kod prawidlowy dziala, bez myslnika nieprawidlowy dziala ale na mm-mmm nie dziala.Co poradzicie?

`from flask import Flask
from flask import request

app=Flask(__name__)
@app.route("/",methods=["GET","POST"])
def kod():
    komunikat="Podaj kod pocztowy"
    form=""" <form method="POST">
            <input type="text" name="code">
            <input type="submit" value="sprawdz">
            </form>
    """
    code=request.form.get("code")
    kom=""
    if code is not None:
        if len(code)==6 and code[2]=='-':
            try:
                [int(x) for x in range(len(code))]
                kom = " kod prawidlowy"
            except TypeError:
                kom="kod nieprawidlowy"
        else:
            kom = " kod nieprawidlowy"

    return f"{komunikat}{form}{kom}"

if __name__ == '__main__':
    app.run()
0
Aleksander1991 napisał(a):

Zrobilem cos takiego i na kod prawidlowy dziala, bez myslnika nieprawidlowy dziala ale na mm-mmm nie dziala.Co poradzicie?

 [int(x) for x in range(len(code))]

A skąd Ci przyszło do głowy, żeby wsadzić tam range(len(code))? len zwróci Ci długość code (co chyba już wiesz), następnie range zwróci generator liczb z zakresu 0...n-1, gdzie n to jest to co zwrócił len. To bez sensu, sprawdzasz (przez rzutowanie) czy zwracane przez generator liczby są w istocie liczbami

```python,cpp

Wiesz, nie do końca o to chodziło z tym kolorowaniem składni :D Piszesz w Pythonie - znacznik okraszasz słówkiem python. Piszesz w C++ - okraszasz cpp - ale nie wszystko naraz...

1 użytkowników online, w tym zalogowanych: 0, gości: 1