Регулярное выражение для надежного определения пароля

#python-3.x

#python-3.x

Вопрос:

 #!/usr/bin/env python3

import re

passRegex = re.compile(r'''(
        .{8,}                     # 8 or more characters
        [A-Z]                     # at least 1 A-Z char
        [a-z]                     # at least 1 a-z char
        [0-9]                     # at least 1 0-9 number
        )''', re.VERBOSE)

    
def strong_password():
    password = input("Enter a password: ")
    match = passRegex.search(password)
    if (not match):
        print("Password not strong enough")
        return False
    else:
        print("Password is strong")
        return True

strong_password()
 

Это из главы 7 «автоматизируйте скучные вещи с помощью python». Может кто-нибудь объяснить, что я делаю не так? По какой-то причине мое регулярное выражение работает не так, как предполагалось.

Вот полный вопрос: напишите функцию, которая использует регулярные выражения, чтобы убедиться, что передаваемая строка пароля является надежной. Надежный пароль определяется как пароль длиной не менее восьми символов, содержащий как прописные, так и строчные символы и содержащий не менее одной цифры. Возможно, вам потребуется проверить строку на соответствие нескольким шаблонам регулярных выражений, чтобы проверить ее надежность.

Комментарии:

1. «По назначению», может быть, приведите несколько примеров ввода / вывода, как вы предполагаете, и объясните, на каком входе ваш код выдает неправильный вывод? Кстати, if not b then else эквивалентно if b else then

2. Извините. Вот пример: $ python3 strongPassword. py Введите пароль: пароль qweQWE123 недостаточно надежный. Я ожидаю, что это будет надежный пароль.

Ответ №1:

Вы намереваетесь указать ряд требований к паролю, но ваше текущее регулярное выражение фактически не выполняет эти утверждения. Один из способов сделать это — добавить положительный прогноз для каждого требования:

 passRegex = re.compile(r'^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}


Комментарии:

1. Почему это так? Когда я передаю их по отдельности, используя upper = re.compile[A-Z] lower = re.compile[a-z] и т.д. это работает.

Ответ №2:

Попробуйте поместить свой объект регулярного выражения внутрь функции, которую вы игнорировали. И передайте пароль (ввод) в вашу функцию.

Здесь я сделал для своего

 import re  

# create a function isPasswordStrong 
def isStrongPass(password):
# create the Regex object from re.compile
    passwordRegex = re.compile(r"""
         (?=.*[a-z])   # matching with char a to z (0 or more)
         (?=.*[A-Z])   # matching with char A to Z (0 or more)
         (?=.*[0-9])   # matching with digit from 0-9
         .{8,}        # must have at least 8 or more
          """, re.VERBOSE)
     passEvaluation = passwordRegex.search(password)
     if passEvaluation != None:  # if it is matched
         return True # Return this 

print('Enter your password: ')
password = input()

test = isStrongPass(password)
if test == True:
     print('Your password is STRONG')
else:
     print('Weak password')
 

Ответ №3:

ответ @ Tim's отлично показывает регулярное выражение, которое работает по назначению, в этом ответе будет конкретно указано, почему ваш текущий шаблон этого не делает.

Регулярное выражение очень специфично для упорядочения. Давайте пройдемся по вашему регулярному выражению.

.{8,} соответствует любому символу до 8 раз.

[A-Z] ПОСЛЕ ЭТОГО выполняется поиск ОДНОЙ заглавной буквы.

[a-z] ПОСЛЕ ЭТОГО выполняется поиск ОДНОЙ строчной буквы.

[0-9] ПОСЛЕ ЭТОГО выполняется поиск ОДНОГО целого числа 0-9.

Порядок имеет значение. Единственное, что соответствует вашему регулярному выражению, это пароль, подобный so:

1234AbCdAa8

8 или более любых символов, за которыми следует одна заглавная, затем одна строчная, затем число. Любая строка, которая не соответствует этому шаблону, не будет регистрироваться как совпадение в вашем регулярном выражении.

, re.VERBOSE)

Комментарии:

1. Почему это так? Когда я передаю их по отдельности, используя upper = re.compile[A-Z] lower = re.compile[a-z] и т.д. это работает.

Ответ №2:

Попробуйте поместить свой объект регулярного выражения внутрь функции, которую вы игнорировали. И передайте пароль (ввод) в вашу функцию.

Здесь я сделал для своего


Ответ №3:

ответ @ Tim’s отлично показывает регулярное выражение, которое работает по назначению, в этом ответе будет конкретно указано, почему ваш текущий шаблон этого не делает.

Регулярное выражение очень специфично для упорядочения. Давайте пройдемся по вашему регулярному выражению.

.{8,} соответствует любому символу до 8 раз.

[A-Z] ПОСЛЕ ЭТОГО выполняется поиск ОДНОЙ заглавной буквы.

[a-z] ПОСЛЕ ЭТОГО выполняется поиск ОДНОЙ строчной буквы.

[0-9] ПОСЛЕ ЭТОГО выполняется поиск ОДНОГО целого числа 0-9.

Порядок имеет значение. Единственное, что соответствует вашему регулярному выражению, это пароль, подобный so:

1234AbCdAa8

8 или более любых символов, за которыми следует одна заглавная, затем одна строчная, затем число. Любая строка, которая не соответствует этому шаблону, не будет регистрироваться как совпадение в вашем регулярном выражении.