#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 или более любых символов, за которыми следует одна заглавная, затем одна строчная, затем число. Любая строка, которая не соответствует этому шаблону, не будет регистрироваться как совпадение в вашем регулярном выражении.