Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2018 11:39:07

Ethex
Зарегистрирован: 2017-10-19
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения Учебное задание

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

 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('Пароль достаточно надёжен')
Но, мне кажется (впрочем, не кажется, а так и есть), моё решение не является лаконичным и красивым.
Глава о регулярных выражениях со скрипом пошла. Подскажите пожалуйста как стоило бы написать функцию

Офлайн

#2 Март 13, 2018 16:16:19

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Регулярные выражения Учебное задание

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Март 13, 2018 16:49:41

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Регулярные выражения Учебное задание

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))
2. По re.исходя из постановки задачи можно обойтись и одной регуляркой вмсто 4-х:
 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)

Офлайн

#4 Март 14, 2018 14:05:06

Ethex
Зарегистрирован: 2017-10-19
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения Учебное задание

Ух ты! search может принимать строку в качестве второго аргумента. Цикл по списку из регулярок симпатичный. А сформировать одну регулярку я пытался, но не срослось. Про спецсимволы ?= в главе не было сказано (впрочем, оно и понятно - мало ли чего в одну главу книги может не вместиться).
PEHDOM,JOHN_16, спасибо вам за ответы. Будем учиться дальше

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version