2017-10-19 1 views
3

On m'a demandé de créer un programme qui identifie si un mot de passe est valide ou non. La partie avec laquelle je me bats est d'identifier s'il y a deux personnages identiques l'un à côté de l'autre. L'aide serait appréciée et voici le programme jusqu'à présent:Identifier s'il y en a deux du même caractère adjacent à eachother

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

Le test et la réponse pour la longueur du mot de passe minimum ne sont pas d'accord. (« Moins de 6 » est pas le contraire de « plus de 6 ») – trentcl

Répondre

2

Le regex pour vérifier les caractères adjacents est

(.)\1 

La période (.) correspond à n'importe quel caractère. Les parenthèses créent un groupe de capture autour de ce caractère, qui est ensuite référencé par \ 1.

Ainsi, la condition serait:

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

Notez le caractère r avant l'expression régulière. Cela en fait une chaîne brute . Les expressions régulières doivent toujours être des chaînes brutes. Cela garantit que certains caractères spéciaux dans l'expression régulière (comme \ b) ne sont pas interprétés avant d'être transmis au module re.

Vous pouvez tester l'expression régulière ici: http://regexr.com/3h0g0

1

Je pense que le regex r'(.)\1' devrait faire ce que vous cherchez, où \1 est une référence arrière.

0

Une façon est d'utiliser les any et all fonctions:

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

Pourriez-vous préciser ce que tout cela fait? Est-ce que quelque chose comme 'tous (Pswrd [i]! = Pswrd [i + 1] pour i dans xrange (len (Pswrd) -1))' ne pas être plus simple? – ryachza

0

Vous pouvez utiliser et le groupe des backreferences capture.

(.)\1 

Ceci correspondrait s'il y avait deux caractères identiques adjacents.

Pour plus de deux caractères, vous pouvez utiliser ce qui suit.

(.)\1+ 

Check it out here.

0

Vous pouvez list() le mot de passe dans une liste et faire:

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) 

Retourne vrai, il retourne faux s'il y a des points où deux lettres adjacentes les unes aux autres sont les mêmes

+0

Je viens de me rendre compte que c'est un __bit__ plus basique que les autres – AJ123