Форум сайта python.su
Доброго времени суток
Выполняю учебное задание. Нужно написать функцию, которая будет использовать регулярные выражения для проверки надёжности пароля. Надёжный пароль - тот, который “состоит по меньшей мере из восьми символов, содержит символы в верхнем и нижнем регистре и включает по крайней мере одну цифру”
Задачу решить удалось
def rightPassword(password): import re symbolCountRegex = re.compile(r'(.){8,}') mo1 = symbolCountRegex.search(password) lowInRegex = re.compile(r'[a-z]') mo2 = lowInRegex.search(password) highInRegex = re.compile(r'[A-Z]') mo3 = highInRegex.search(password) decInRegex = re.compile(r'(\d){1,}') mo4 = decInRegex.search(password) if mo1 == None: print('Пароль недостаточно надёжен') elif mo2 == None: print('Пароль недостаточно надёжен') elif mo3 == None: print('Пароль недостаточно надёжен') elif mo4 == None: print('Пароль недостаточно надёжен') else: print('Пароль достаточно надёжен')
Офлайн
здесь вообще регулярки не нужны, но это учебное задание.
1) В данном случае не обязательно каждый раз компилировать шаблон регулярного выражения - можно сразу использовать re.search.
2) Алгоритмически не нужно вычислять дальнейшие проверки если хотя бы одна из них уже не пройдена.
3) блок с кучей if можно переписать лучше.
Посему я бы предложил как простое решение просто переделать ваш код так:
def rightPassword(password): patterns = [ r'(.){8,}', r'[a-z]', r'[A-Z]', r'(\d)+', ] for pattern in patterns: if re.search(pattern, password) is None: return False return True
Офлайн
1. по поводу как стоило бы написать.У вас все вперемешку, както упорядочте,
например вот так функция выгляди более читабельной:
def rightPassword(password): symbolCountRegex = re.compile('(.){8,}') lowInRegex = re.compile('[a-z]') highInRegex = re.compile('[A-Z]') decInRegex = re.compile('(\d){1,}') if (symbolCountRegex.search(password) and lowInRegex.search(password) and highInRegex.search(password) and decInRegex.search(password) ): print('Пароль {} достаточно надёжен'.format(password)) else: print('Пароль {} недостаточно надёжен'.format(password))
def validate_passwd(password): result = re.match('((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})', password) if result: print('Пароль {} достаточно надёжен'.format(password)) else: print('Пароль {} недостаточно надёжен'.format(password))
[code python][/code]
Отредактировано PEHDOM (Март 13, 2018 17:27:25)
Офлайн
Ух ты! search может принимать строку в качестве второго аргумента. Цикл по списку из регулярок симпатичный. А сформировать одну регулярку я пытался, но не срослось. Про спецсимволы ?= в главе не было сказано (впрочем, оно и понятно - мало ли чего в одну главу книги может не вместиться).
PEHDOM,JOHN_16, спасибо вам за ответы. Будем учиться дальше
Офлайн