2 votes

Motif Regex Python

J'essaie d'écrire un programme qui utilise des expressions régulières pour s'assurer que la chaîne de mots de passe qui lui est transmise est forte. Un mot de passe fort est défini comme étant un mot de passe d'au moins huit caractères, contenant à la fois des majuscules et des minuscules, et comportant au moins un chiffre. Pour l'instant, j'ai le code suivant. J'ai passé des heures à bricoler l'expression régulière, mais je n'arrive pas à la faire passer. Chaque fois que je fais un changement, il semble qu'un mot de passe fort soit marqué comme faible, ou un faible comme fort. Avez-vous une idée de la façon dont je peux améliorer cela ?

import re

pass2Regex = re.compile(r'''
    \d*
    [a-zA-Z]*
    \d*
    [a-zA-Z]*
    ''',re.VERBOSE)

text = raw_input("enter your password\n")
if len(text) >= 8:
    search = pass2Regex.findall(text)
    if text in search:
        print "%s is a strong password" % (text)
    else:
        print "%s is a weak password" % (text)
else:
    print "%s is a weak password" % (text)

Par exemple, actuellement, si le mot de passe était "231242441", il serait marqué comme un mot de passe fort même s'il ne contient pas de lettres. De plus, lorsque j'essaie un + au lieu d'un *, il n'accepte que les mots de passe qui commencent par un chiffre, etc.

Merci pour votre aide

1voto

alexis Points 10856

Vous pouvez travailler avec tout Python, alors ne vous limitez pas à une seule regexp. Ecrivez une regexp pour chaque condition que le mot de passe doit satisfaire. "Contient des majuscules" ? Trivial. "Minuscules" ? Également trivial. "Au moins un chiffre" ? Aucun problème. "Au moins 8 caractères" ? Vous n'avez même pas besoin d'un regexp.

Vous pouvez effectuer les tests en cascade, combiner une série de tests avec and Vous pouvez également regrouper les tests dans une liste et les appliquer en une seule fois, comme ceci :

tests = [ "[A-Z]", "[a-z]", r"\d", ".{8}" ]
if all(re.search(pat, text) for pat in tests):
    print("It's a strong password")

Gardez vos heures d'effort pour l'étape suivante.

0voto

Jan Points 370

Comme l'ont mentionné d'autres personnes, il s'agit d'un cas typique d'utilisation de lookarounds (lookaheads dans cette situation).
Un aperçu regarde vers l'avenir sans consommer de personnages (il s'agit d'une affirmation).
En fonction de vos besoins :

Un mot de passe fort est défini comme un mot de passe d'au moins huit caractères. caractères, qui contient des majuscules et des minuscules et qui comporte au au moins un chiffre.

^                    # anchors the expression to the beginning
    (?=[^a-z]*[a-z]) # not lowercase, followed by lowercase
    (?=[^A-Z]*[A-Z]) # not UPPERCASE, followed by UPPERCASE
    (?=\D*\d)        # not a digit, followed by a digit
    .{8,}            # at least 8 characters long
$                    # anchor the expression to the end

Voir une démo sur regex101.com .


Donc pour votre extrait de code, ce serait :

import re
pass2Regex = re.compile(r"""
    ^                    # anchors the expression to the beginning
        (?=[^a-z]*[a-z]) # not lowercase, followed by lowercase
        (?=[^A-Z]*[A-Z]) # not UPPERCASE, followed by UPPERCASE
        (?=\D*\d)        # not a digit, followed by a digit
        .{8,}            # at least 8 characters long
    $                    # anchor the expression to the end
""", re.VERBOSE)

password = "WeaK1234"
password2 = "strong?"

if pass2Regex.search(password):
    print "Strong!"

if pass2Regex.search(password2):
    print "Strong!"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X