2017-10-19 3 views
3

Ich wurde aufgefordert, ein Programm zu erstellen, das angibt, ob ein Kennwort gültig ist oder nicht. Der eine Teil, mit dem ich mich abmühen muss, besteht darin, festzustellen, ob zwei gleiche Zeichen nebeneinander liegen. Hilfe würde geschätzt und hier ist das Programm so weit:Identifizieren, ob zwei gleiche Zeichen nebeneinander liegen

import re 

pswrd = input("Enter Desired Password:") 

if len(pswrd) < 6: 
    print("Password must have more than 6 characters.") 
if len(pswrd) > 15: 
    print("Password must have no more than 15 characters.") 
if re.search("[$#@]",pswrd): 
    print("Password must have no special characters.") 
if not re.search("[0-9]",pswrd): 
    print("Password must contain a number.") 
if not re.search("[a-z]",pswrd): 
    print("Password must contain a lower case letter.") 
if not re.search("[A-Z]",pswrd): 
    print("Password must contain an upper case letter.") 
+0

Der Test und die Antwort für minimale Passwortlänge nicht übereinstimmen. ("weniger als 6" ist nicht das Gegenteil von "mehr als 6") – trentcl

Antwort

2

Die Regex, um nach benachbarten Zeichen zu suchen, ist

(.)\1 

Der Punkt (.) entspricht einem beliebigen Zeichen. Die Klammern erstellen eine Erfassungsgruppe um dieses Zeichen herum, auf die dann mit \ 1 verwiesen wird.

So würde die Bedingung sein:

if re.search(r"(.)\1", pswrd) 

Beachten Sie die r Zeichen vor dem regulären Ausdruck. Dies macht es eine rohe Zeichenfolge. Reguläre Ausdrücke sollten immer zu rohen Strings gemacht werden. Dies stellt sicher, dass bestimmte Sonderzeichen in der Regex (wie \ b) nicht interpretiert werden, bevor sie an das re-Modul übergeben werden.

können Sie den regulären Ausdruck hier testen: http://regexr.com/3h0g0

1

Ich denke, die regex r'(.)\1' sollte das tun, was Sie suchen, wo \1 ein Rückreferenzierung ist.

0

Eine Möglichkeit ist es, die any und all Funktionen zu verwenden:

pswrd = input("Enter Desired Password:") 
if any(all(b[0] == b[i] for i in range(len(b))) for b in [[pswrd[c], pswrd[c+1]] for c in range(len(pswrd)-1)]): 
    pass 
+0

Könnten Sie näher erläutern, was das alles macht? Wäre etwas wie 'all (pswrd [i]! = Pswrd [i + 1] für i in xrange (len (pswrd) -1))' nicht einfacher? – ryachza

0

Sie Rückreferenzierungen und Capture-Gruppe nutzen könnten.

(.)\1 

Dies würde übereinstimmen, wenn zwei gleiche Zeichen nebeneinander liegen.

Für mehr als zwei Zeichen könnten Sie Folgendes verwenden.

(.)\1+ 

Überprüfen Sie es here.

0

Sie könnten das Passwort in eine Liste list() und dies tun:

pswrd = 'assdfds' 
pswrd = list(pswrd) 
for i in range(len(pswrd)): 
    try: 
     if pswrd[i] == pswrd[i+1]: 
      a = True 
      break 
    except IndexError: 
     a = False 
     break 
    else: 
     continue 
    a = False 
print(a) 

Dies gibt True zurück, es False zurückgibt, wenn es Punkte gibt, in denen zwei Buchstaben benachbart zueinander sind die gleichen

+0

Ich habe gerade festgestellt, dass es __bit__ basischer ist als die anderen – AJ123

Verwandte Themen