Bonjour,
J'ai un exercice à faire et le but est de demander un mdp a l'utilisateur et de vérifier s'il contient au moins un caractère spécial,un chiffre et une voyelle minuscule. Mais je ne vois pas comment faire pour qu'il détecte si le mdp contient tout ça (sinon le "reste" je peux le faire)
pour l'instant j'ai fait que ça :
verif_finale=[":","?","$","!","1","2","3","4","5","6","7","8","9","0","a","e","i","o","u","y"]
cara=[":","?","$","!"]
nbr=["1","2","3","4","5","6","7","8","9","0"]
lettre=["a","e","i","o","u","y"]
mdp=input("Entrer votre mot de passe.")
Tu dois faire une boucle qui parcours toute les lettres de ton mot de passe, puis dans cette boucle t’en fais une autre qui teste pour chaque caractère de ton mot de passe si il est présent dans tes listes, si le caractère est présent dans caractère spécial par exemple tu passes un boolean en true, pareil pour les autres
Voilà une possibilité pour terminer ton script de vérification:
- créer une variable booléenne pour chaque contrainte (voyelle minusucule, chiffre, caractère spécial) que tu initialise à False
- itérer sur chaque caractère de mdp</mdp> et pour chaque contrainte, vérifier si le caractère se trouve dans la liste de caractères valides. Si oui, tu passes la variable booléenne correspondante à True.
- à la fin, tu renvoies vrai si toutes les variables booléennes sont vraies.
Le pseudo-code :
<code>fonction valider_mot_de_passe(mdp)
b_voyelle = False
b_chiffre = False
b_special = False
Pour c dans mdp faire
si b_voyelle est faux et que c est dans lettre alors b_voyelle devient vrai
si b_chiffre est faux et que c est dans nbr alors b_chiffre devient vrai
si b_special est faux et que c est dans cara alors b_special devient vrai
fin pour
Retourner vrai si b_voyelle est vrai et b_chiffre est vrai et b_special est vrai sinon retourner faux
Une autre façon de s'y prendre
Comme toujours il y a plusieurs façon de résoudre ton problème. Celle que tu a commencé à implémenter est bonne, mais elle a l'inconvénient d'obliger à déclarer explicitement la liste des caractères spéciaux. Or, aujourd'hui l'encodage unicode des caractères permet de représenter à peu près n'importe quelle caractère de n'importe quelle système d'écriture, et même des glyphes du genre '😆','🙅' ou '∜'.
Pourquoi est-ce que "Enchanté ➔ ՈՒրախ եմ Ձեզ հետ ծանոթանալ😆" ne pourrait pas être un mot de passe valide? Il y a pourtant deux voyelles minuscules (a et é), deux caractères spéciaux (➔ et 😆, sans compter les espaces) et des lettres (EnchntՈՒրախեմՁեզհետծանոթանալ). En plus ça permet de construire des passphrases complexes incrackables.
Imagine s'il fallait lister tous les caractères spéciaux de l'unicode, il y en a des centaines : https://unicode-table.com
Ça sort certainement pas mal de ce qu'on te demande, mais pour mettre l'exo. en perspective voici une solution qui ne nécessite pas de dresser la liste des caractères spéciaux.
Pour ça on peut utiliser des expressions régulières ou REGEX : https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/916990-les-expressions-regulieres-partie-1-2
Pour faire (trop) simple, une expression régulière est une chaîne de caractères qui décrivent des 'règles' de recherche de chaînes de caractères. Par exemple, la règle "toutes les chaînes 'mp' suivi d'un chiffre" décrit les chaînes "mp3","mp4","mp5", etc. et se traduit par l'expression régulière 'mp[0-9]'. [0-9] signifie dans une expression régulière "n'importe quel chiffre entre 0 et 9".
En python on peut utiliser la bibliothèque re pour manipuler des regex. Par exemple, re.search(r, str)
recherche la première sous-chaîne de str
qui correspond à la regex r
. re.search('mp[0-9]', 'Le fichier issou.mp3 ')
renverra donc un objet de type 'match' contenant la chaîne 'mp3'. re.search('mp[0-9]', 'Bonjour ')
renverra None
.
Pour répondre à l'exercice en avec des regex on peut faire ainsi :
1) On enlève les espaces de mdp
pour les ignorer dans les vérifications, et on supprime les accents.
2) On vérifie qu'on trouve au moins une voyelle dans mdp
avec l'expression régulière '[aeiouy]' (un caractère parmis 'a','e','i','o','u' ou 'y'). Si oui on passe à l'étape suivante
3) On vérifie qu'on trouve au moins un chiffre dans mdp
avec la regex '\d' (équivalente à '[0-9]' : un chiffre entre 0 et 9). Si oui on passe à l'étape suivante
4) On vérifie qu'on trouve au moins un caractère qui n'est ni un chiffre ni une lettre dans mdp
avec la regex '[\W_]' (\W signifie 'un caractère qui n'est pas une lettre, pas un chiffre et pas underscore'. '[\W_]' signifie 'un caractère qui n'est pas un chiffre, pas une lettre mais qui peut être un underscore). Si oui le mot de passe est valide.
Avec cette solution :#abcdef gh99
est un mdp valide.8) Enchanté ➔ ՈՒրախ եմ Ձեզ հետ ծանոթանալ😆
est un mdp valide.18⚓⚓⚓⚓⚓⚓⚓⚓⚓⛵a
est aussi valide.
Le code commente et testable directement est ici : https://repl.it/repls/FreePreviousAbilities