String auf Zeichen überprüfen

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
mrmiyagi
User
Beiträge: 2
Registriert: Freitag 2. August 2013, 13:32

Hallo zusammen,
ich würde gerne eine Benutzereingabe auf Zeichen (die ich selbst bestimmt habe) überprüfen lassen.

In Javascript würde ich das ganze folgendermaßen umsetzen:

Code: Alles auswählen

for (i=0; i < value.length; i++)
   if (value.charAt(i) == ä || value.charAt(i) == ö || value.charAt(i) == ü) print ("Ungültig!);
Wie bekomme ich nun in python die Länge eines Wertes herraus um eine ähnliche Schleife aufzubauen? len(value) ?
Wie könnte man das ganze am geschicktesten umsetzen? Gibt es auch hier die Möglichkeit die Zeichen Schritt für Schritt durchzuprüfen?

Vielen Dank vorab für hilfreichen Hinweise.
Zuletzt geändert von mrmiyagi am Freitag 2. August 2013, 13:43, insgesamt 2-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Wenn du len verwendest um über etwas zu iterieren, dann machst du bei Python etwas falsch. du kannst auch direkt über Sequenzen gehen:

Code: Alles auswählen

for char in "spam ham eggs:
    print char
Wenn du doch mal einen Index brauchst, dann hilft dir die enumerate-Funktion. Alles das ist hier aber gar nicht notwendig, da du einfach ``in`` verwenden kannst:

Code: Alles auswählen

if "ä" in value or "ö" in value or "ü" in value:
    ...
oder über Mengen

Code: Alles auswählen

if set("aöü").intersection(set(value)):
    ...
Am besten erzählst du uns aber, was du genau vor hast. Es sieht nämlich so aus, als könnte dein Problem noch schöner gelöst werden.
Das Leben ist wie ein Tennisball.
BlackJack

@mrmiyagi: Wie man die Länge einer Zeichenkette ermittelt, und auch dass Du das hierfür gar nicht brauchst, hätte Dir so ziemlich jedes Python-Tutorial verraten. Die Länge brauchst Du nicht weil man in Python direkt über die Elemente von Sequenztypen iterieren kann. Eine spezielle Zählschleifensyntax wie in JavaScript hat Python gar nicht erst.

Edit: Noch eine Variante:

Code: Alles auswählen

    if any(c in u'äöü' for c in value):
        print u'Ungültig!'
mrmiyagi
User
Beiträge: 2
Registriert: Freitag 2. August 2013, 13:32

Das ging ja fix! :shock:

Vielen Dank für eure Hinweise. Ich werde mal veruschen damit weiterzukommen!

Hintergrund:
Ich würde gerne eine Passworteingabe auf bestimmte Zeichen überprüfen lassen, um dieses für gültig oder ungültig erklären zu können.
In Javascript habe ich so etwas schon recht simple hinbekommen und nun geben ich mich an python mal ran.

Python ist, wie ich finde, eine schöne überschauliche Scriptsprache.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wie schon erwähnt: Nimm Sets (Mengen). Wenn von der Mengenleere noch ein bißchen was hängengeblieben ist (oder man Grundkenntnisse zu Bitoperationen hat und die zu übertragen weiß), dann sollte folgendes Konstrukt nach ein bißchen Nachdenken eigentlich verständlich sein:

Code: Alles auswählen

def is_valid_password(password, illegal_characters='äüö'):
    return not set(password.lower()) & set(illegal_characters)
Mal als ganzes Programm:

Code: Alles auswählen

#/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function

def is_valid_password(password, illegal_characters='äüö'):
    return not set(password.lower()) & set(illegal_characters)

def main():
    for pw in ('bla', 'blä', 'BLÄ'):
        print(pw, 'ist', 'gültig' if is_valid_password(pw) else 'ungültig')


if __name__ == '__main__':
    main()
Aus dem `&` musst du ein `&` machen. Der Code-Parser zickt bei dem Zeichen leider rum.
BlackJack

Wobei ich mir gerade die Frage stelle warum man Zeichen in Passwörtern verbieten möchte. Überall wird einem gesagt, dass man Sonderzeichen verwenden soll, und dann kommt ein Skript daher und verbietet bestimmte Zeichen wieder.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@BlackJack: So viel Entropie an einem Ort ist gefaehrlich :roll:
BlackJack

Nur mal so am Rande bezüglich der JavaScript-Umsetzung: Das `charAt()` braucht man nur für ältere Browser/JavaScript-Implementierungen. Moderne sollten die Indexsyntax kennen, also ``s`` statt ``s.charAt(i)``. Und anstelle der langatmigen Oder-Verknüpfungen könnte man die `indexOf()`-Methode auf Zeichenketten verwenden:

Code: Alles auswählen

var FORBIDDEN_CHARACTERS = 'äöü';

var isValidPassword = function (password) {
    for (var i = 0; i < password.length; i++) {
        if (FORBIDDEN_CHARACTERS.indexOf(password[i]) >= 0) {
            return false;
        }
    }
    return true;
};
Mit Underscore.js wird die Funktion zu einem Einzeiler:

Code: Alles auswählen

var isValidPassword = function (password) {
    return !_(password).some(_.partial(_.contains, FORBIDDEN_CHARACTERS));
};
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Durch die sehr schöne Integration regulärer Ausdrücke in Javascript ist das Problem sogar noch kürzer zu lösen:

Code: Alles auswählen

if(/[äöü]/.test(value)) alert("Ungültig!")
Analog für Python:

Code: Alles auswählen

import re
def isInvalid(value):
    return bool(re.search("[äöü]", value))
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Letzt könnte man noch Klammern in CoffeeScript weglassen:

Code: Alles auswählen

alert "Ungültig!" if /[äöü]/.test value
:D
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten