wtforms+regex

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
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo

Hab ein Problem mit regex und zwar sollen nur Buchstaben und Umlauten und ein Punkt und ein Komma (.,) gematched (<- sagt man das überhaupt so) werden.
zB Mustermann, Dr.
der String wäre dann "Mustermann, Dr."

Wenn aber nun ein Sonderzeichen oder sonst was im Namen steht, dann soll es nicht validiert werden. Leider wird mit unterstehendem Code trotzdem alles validiert.

Code: Alles auswählen

#coding: utf-8

from wtforms import Form, StringField, validators


class NeuerAutor(Form):
    vorname = StringField(u'vorname', [validators.required(), validators.Regexp('[a-zA-Z-äöüàéèÄÖÜ]', message="Error")])
    nachname = StringField(u'nachname', [validators.required(), validators.Regexp('[A-Za-z0-9-äöüàéèÄÖÜ]', message='Error')])

form = NeuerAutor(vorname=u'aD@°#@Jérome', nachname=u'Boateng')

print form.vorname._value(), form.nachname._value()
print form.validate()
print form.errors
BlackJack

@lackschuh: Ich sehe da jetzt keinen Zusammenhang mit `wtforms`. u'[a-zA-Z-äöüàéèÄÖÜ]' matched als regulärer Ausdruck u'aD@°#@Jérome'. Der reguläre Ausdruck sagt es muss eines der Zeichen aus den angegebenen am Anfang stehen und das 'a' trifft da zu. Siehe auch hier: https://regex101.com/r/iY7rF5/1

Code: Alles auswählen

In [16]: m = re.match(u'[a-zA-Z-äöüàéèÄÖÜ]', u'aD@°#@Jérome')

In [17]: m
Out[17]: <_sre.SRE_Match at 0x90ecd78>

In [18]: m.group()
Out[18]: u'a'
Du müsstest Dich also mal mit regulären Ausdrücken auseinandersetzen. In der Python-Dokumentation ist neben der Dokumentation vom `re`-Modul auch ein Howto. Und da reguläre Ausdrücke nicht auf Python beschränkt sind, gibt es auch noch eine ganze Menge anderes Lernmaterial im Netz.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Ja, mit wtforms hat es jetzt noch nichts zu tun.
Wenn ich den regulären Ausdruck auf ``[]a-zA-Zé]+$`` abändere, dann wird ja nur Jérome genommen.

Wie kann ich mir nun anzeigen lassen, dass die anderen eingegebenen Zeichen ungültig sind?
Kann das wtfroms oder muss ich dies manuell prüfen auf die einzelnen Zeichen?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@lackschuh: Dein Ansatz ist falsch. Du glaubst gar nicht, welche Zeichen alle in Namen vorkommen können (Das ärgert dann alle die O`Connor oder Абрамо́вич oder 李平 oder محمد heißen). Welche Zeichen stören Dich denn wirklich im Namensfeld und warum?
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

@Sirius3
Ich gebe dir recht. Mein Problem bzw. meine Angst besteht darin, dass ein paar Witzbolde die DB mit sinnlosen Sonder- und/oder Unicodezeichen zumüllen. Um dem Einhalt zu gewähren, dachte ich mir, dass halt alles außer Buchstaben, Umlaute und eine Hand voll Sonderzeichen nicht zu einer Validierung führt.

Das Ganze könnte ich zwar unterbinden, in dem nur angemeldete User etwas in die DB eintragen dürften...
BlackJack

@lackschuh: Ich verstehe die Angst nicht so wirklich. Was wäre denn schlimm daran? Und was hindert so eine Validierung die Witzbolde daran halt nur die erlaubten Zeichen zu verwenden um die Datenbank voll zu müllen? In der DB einer ehemaligen Schule von mir gibt es Helmut Kohl und Angela Merkel als Ehemalige. Um Müll in eine DB zu stopfen braucht man also keine Sonderzeichen. Wenn Du mit Vandalismus rechnest, und den unterbinden, oder zumindest leichter wieder entfernen können möchtest, musst Du halt eine Zugangskontrolle schaffen. Das ist sinnvoller als echte Namen auszuschliessen.
Antworten