Seite 1 von 1

String auf Zeichen überprüfen

Verfasst: Freitag 2. August 2013, 13:38
von mrmiyagi
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.

Re: String auf Zeichen überprüfen

Verfasst: Freitag 2. August 2013, 13:42
von EyDu
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.

Re: String auf Zeichen überprüfen

Verfasst: Freitag 2. August 2013, 13:43
von 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!'

Re: String auf Zeichen überprüfen

Verfasst: Freitag 2. August 2013, 13:48
von mrmiyagi
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.

Re: String auf Zeichen überprüfen

Verfasst: Freitag 2. August 2013, 15:03
von snafu
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.

Re: String auf Zeichen überprüfen

Verfasst: Freitag 2. August 2013, 15:06
von 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.

Re: String auf Zeichen überprüfen

Verfasst: Freitag 2. August 2013, 15:26
von cofi
@BlackJack: So viel Entropie an einem Ort ist gefaehrlich :roll:

Re: String auf Zeichen überprüfen

Verfasst: Freitag 2. August 2013, 16:37
von 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));
};

Re: String auf Zeichen überprüfen

Verfasst: Freitag 2. August 2013, 18:41
von Sirius3
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))

Re: String auf Zeichen überprüfen

Verfasst: Samstag 3. August 2013, 01:44
von Leonidas
Letzt könnte man noch Klammern in CoffeeScript weglassen:

Code: Alles auswählen

alert "Ungültig!" if /[äöü]/.test value
:D