2016-05-20 9 views
-1

Als Teil einer Aufgabe erstelle ich ein Programm, das einen Benutzer auffordert, einen Benutzernamen und ein Passwort einzugeben.Validieren Sie den Inhalt einer vom Benutzer eingegebenen Zeichenfolge in Python?

ich den Benutzernamen Teil (leicht) abgeschlossen haben, aber in den Zuordnungsanweisungen, muss das Passwort:

  • enthalten einen Großbuchstaben
  • einem Kleinbuchstaben
  • länger als 6 Zeichen
  • enthalten eine Reihe
  • kein weißer Raum
haben

Es gibt 5 spezifische Fehlermeldungen, die angezeigt werden müssen, wenn eine dieser Bedingungen nicht zutrifft.

Was ich derzeit habe, hat ein seltsames Verhalten, die Fehler werden nur in einer bestimmten Reihenfolge angezeigt (zum Beispiel, Passwort "f" wird den Fehler haben "muss ein Großbuchstabe haben" anstelle von "muss länger sein als 6 Zeichen "). Ich weiß, dass dies wegen der Verschachtelungsreihenfolge der if-Anweisungen ist, aber wenn es einen besseren Weg gibt ... Es fängt auch nicht aus weißem Grund Leerzeichen in das Passwort ein. Ich weiß, dass es wahrscheinlich nicht der effizienteste Weg ist, aber hier ist, was ich bisher habe:

def validatePassword(): 
    accept = "n" 
    while accept == "n": 
     password = input("Please enter a valid password: ") 
     upper = "n" 
     lower = "n" 
     digit = "n" 
     length = "n" 
     white = "n" 
     if len(password) >= 6: 
      length = "y" 
     for char in password: 
      if char in string.ascii_uppercase: 
       upper = "y" 
      if char in string.ascii_lowercase: 
       lower = "y" 
      if char in string.digits: 
       digit = "y" 
      if char not in string.whitespace: 
       white = "y" 
     if upper == "y": 
      if lower == "y": 
       if digit == "y": 
        if length == "y": 
         if white == "y": 
          accept = "y" 
         else: 
          print("::: ERROR :::",password,"must not have any white space character.") 
        else: 
         print("::: ERROR :::",password,"must be longer than 6 characters.") 
       else: 
        print("::: ERROR :::",password,"must contain a number.") 
      else: 
       print("::: ERROR :::",password,"must contain a lowercase character.") 
     else: 
      print("::: ERROR :::",password,"must contain an uppercase character.") 

    return password 
+0

Versuchen Sie stattdessen eine Regex. – ZdaR

+0

Nicht einmal sicher, was das ist. Ich bin 8 Wochen in einem 10 Wochen Einführungskurs. –

+0

Vielleicht solltest du mit deinem [Klassenkameraden] arbeiten (http://stackoverflow.com/questions/37337727/python-passwort-verification-program). – TigerhawkT3

Antwort

1

Sie so etwas wie dies versuchen könnte:

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


def validatePassword(password): 
    if not any(x.isupper() for x in password): 
     return False, "No upper case character" 

    if not any(x.islower() for x in password): 
     return False, "No lower case character" 

    if len(password) < 6: 
     return False, "Not longer than 6 characters" 

    if not any(x.isdigit() for x in password): 
     return False, "No number" 

    if any(x.isspace() for x in password): 
     return False, "Contains hitespace" 

    return True, "" 


def test(): 
    # test some passwords 
    test_passwords = ["lkjasdf", "KAJSDF", "lfSF", "asdfADSF", "asdf ADSF 123", "asdfADSF123"] 
    for p in test_passwords: 
     print validatePassword(p) 

    # "real" usage 
    while True: 
     password = input("Please enter a valid password: ") 
     result, message = validatePassword(password) 
     if result is True: 
      break 
     else: 
      print(message) 

if __name__ == '__main__': 
    test() 
0

Offensichtlich ist der richtige Weg, dies zu tun ist mit any() und einem Generator Ausdruck, aber zu sehen, wie Sie gesagt I'm like 8 weeks into a 10 week introductory course diejenigen wahrscheinlich nicht helfen Ihnen.

Hier ist, wie Sie es tun können ohne() zu verwenden, indem Sie einfach die Zeichen durchlaufen, die auf das Vorhandensein bestimmter Arten von Zeichen prüfen.

def validate_password(password): 
    hasUpper = hasLower = hasNumber = hasWhiteSpace = False 

    for char in passwordStr: 
     if char.isupper(): 
      hasUpper = True 
     if char.islower(): 
      hasLower = True 
     if char.isdigit(): 
      hasNumber = True 
     if char.isspace(): 
      hasWhiteSpace = True 

    if len(password) <= 6: 
     return False, "Password must be longer than 6 characters" 
    if not hasUpper: 
     return False, "Password must contain atleast one uppercase character" 
    if not hasLower: 
     return False, "Password must contain atleast one lowercase letter" 
    if not hasNumber: 
     return False, "Password must contain alteast one number" 
    if hasWhiteSpace: 
     return False, "Password cannot contain any white space" 

    return True 
+1

Super, ich werde das versuchen, danke! –

+0

Ich mag die Art, wie dies strukturiert ist, aber was passiert, ist, dass es immer den Wert True zurückgibt und das Passwort akzeptiert. –

+0

benutzte ich eine While-Schleife im Hauptprogramm: akzeptieren = False während akzeptieren = False password = getpass() accept = validatePassword (Passwort) Das Validate-Programm sollte entweder einen wahren oder falschen Booleschen Wert zurück zu accept, und es sollte entweder die while-Schleife fortsetzen oder beenden. Es endet einfach sofort. –

0

Zunächst gibt es den Datentyp bool, die die Werte True und False darstellen können. Sie sollten sie verwenden, um einfache Wahr/Falsch-Zustände darzustellen, anstatt die Strings "y" und "n" zuzuweisen.

Zweitens ist es möglich, jedes Zeichen einzeln zu prüfen und zu speichern, ob die verschiedenen Bedingungen mindestens einmal erfüllt sind. Python verfügt jedoch über leistungsstarke Methoden zur Überprüfung von Strings, die Ihr Leben erheblich vereinfachen können. Lassen Sie mich ihnen zeigen, indem sie eine kurze Funktion zu schreiben, die aa Passwort als Argument und gibt einfach True oder False in Abhängigkeit davon, ob die Passwörter erfüllt Ihre Einschränkungen:

def is_password_valid(password): 

    # check password length: 
    if len(password) < 6: 
     print("Your password is too short, at least 6 characters are required!") 
     return False 

    # check if password contains any non-alphanumeric letters (including whitespace): 
    # (isalnum() only returns true if the string only contains letters and digits, nothing else) 
    if not password.isalnum(): 
     print("Your password may only contain letters and digits!") 
     return False 

    # check if password contains letters: 
    # (isdigit() only returns true if all of the characters are numbers) 
    if password.isdigit(): 
     print("Your password does not contain any letters!") 
     return False 

    # check if password contains uppercase letters: 
    # (islower() only returns true if all of the letters are lowercase, non-letters are ignored) 
    if password.islower(): 
     print("Your password does not contain any uppercase letters!") 
     return False 

    # check if password contains lowercase letters: 
    # (isupper() only returns true if all of the letters are uppercase, non-letters are ignored) 
    if password.isupper(): 
     print("Your password does not contain any lowercase letters!") 
     return False 

    # check if password contains lowercase numbers: 
    # (isalpha() only returns true if all of the characters are letters) 
    if password.isalpha(): 
     print("Your password does not contain any numbers!") 

    # if all conditions above are okay, the password is valid: 
    print("The password is okay.") 
    return True 

Sie können natürlich, wie Sie die Blöcke in meinem obigen Code neu anordnen Wunsch.

Sie können dann einfach diese Hilfsfunktion in Ihrer Schleife verwenden, die jetzt viel einfacher und sauberer aussieht:

def validate_password(): 
    accept = False 
    while not accept: 
     password = input("Please enter a valid password: ") 
     accept = is_password_valid(password) 
+0

'wenn len (passwort) <6:' sollte 'if len (passwort) <= 6:' – Keatinge

+0

@Racialz Das hängt davon ab, ob wir die textuelle Beschreibung oder den Code des OPs betrachten. Während der Text sagt "sei länger als 6 Zeichen", sagt der Code "' if len (Passwort)> = 6: length = "y" '". Sie sollten in der Lage sein, das anzupassen, wenn meine Interpretation falsch ist. –

0

können Sie reguläre Ausdrücke versuchen. Wenn Sie nicht über Regex wissen, wie Sie in Ihrem Kommentar erwähnt haben, ist this eine großartige Website.

Überprüfen Sie zur Überprüfung, ob das Passwort mit einer der Regeln übereinstimmt, die es ungültig machen, und wenn nicht, ist es ein gültiges Passwort.

import re 
def validate(passwd): 
    pattern = r'^(.{0,5}|[^0-9]*|[^A-Z]*|[^a-z]*|.*\s+.*)$' 
    result = re.search(pattern, passwd) 
    if result: 
    print 'Invalid Password' 
    else: 
    print 'Valid Password' 

Was dies tut, ist zu überprüfen, ob, passwd weniger als 6 Zeichen ist oder enthält keine Zahlen oder enthält keine Großbuchstaben Zeichen oder enthält keine Klein Zeichen OR Leerzeichen enthält. Wenn keines der Kriterien zutrifft, ist das Passwort gültig.

Verwandte Themen