- не меньше 8 символов
- должна присутствовать хотя бы одна цифра [0-9]
- должна присутствовать хотя бы одна заглавная буква [A-Z]
- должна присутствовать хотя бы одна строчная буква [a-z]
Для последовательного перебора символов [a-z] при сравнении, можно использовать такую конструкцию:
>>> for c in range( ord('a'), ord('z')+1 ):
>>> print chr(c),
>>> map(chr, range(97, 123))
или
>>> map(chr, range(ord('a'), ord('z')))
Пример реализации. Функция возвращает False, если пароль не удовлетворяет требованиям, или True если ОК:
>>> def lst_seq(v1, v2):
>>> return map(chr, range(ord(v1), ord(v2)))
>>> return map(chr, range(ord(v1), ord(v2)))
>>> def check_psw(psw):
>>> digit = False
>>> upper = False
>>> lower = False
>>> if len(psw) >= 8:
>>> for x in psw:
>>> if x in lst_seq('0','9'):
>>> digit = False
>>> upper = False
>>> lower = False
>>> if len(psw) >= 8:
>>> for x in psw:
>>> if x in lst_seq('0','9'):
>>> digit = True
>>> if x in lst_seq('A', 'Z'):
>>> if x in lst_seq('A', 'Z'):
>>> upper = True
>>> if x in lst_seq('a', 'z'):
>>> if x in lst_seq('a', 'z'):
>>> lower = True
>>> return digit and upper and lower
>>> return digit and upper and lower
Теперь варианты от гуру:
для Python 3.3
>>> return (len(psw) >= 8 and
>>> any([ch.isupper() for ch in psw]) and
>>> any([ch.isdigit() for ch in psw]) and
>>> any([ch.islower() for ch in psw]))
Вариант с регекспами:
>>> import re>>> def check_psw(psw):
>>> return len(psw) >= 8 and
>>> bool(re.match("^.*[A-Z]+.*$", psw) and
>>> re.match("^.*[a-z]+.*$", psw) and
>>> re.match("^.*[0-9]+.*$", psw))
или
>>> import re
>>> def check_psw(psw):
>>> return bool(re.match("((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8})", psw))
или
>>> import re
>>> def check_psw(psw):
>>> if len(psw) < 8:
>>> return False
>>> for r in ('[a-z]', '[A-Z]', '\d'):
>>> if re.search(r, psw) is None:
>>> return False
>>> return True
Вариант с set для Python 3.3:
>>> import string
>>> upper = set(string.ascii_uppercase)
>>> lower = set(string.ascii_lowercase)
>>> digits = set(string.digits)
>>> def check_psw(psw):
>>> letters = set(psw)
>>> return bool(len(psw) >= 8 and upper & letters and lower & letters and digits & letters)
или
>>> import re
>>> def check_psw(psw):
>>> if len(psw) < 8:
>>> return False
>>> for r in ('[a-z]', '[A-Z]', '\d'):
>>> if re.search(r, psw) is None:
>>> return False
>>> return True
Вариант с set для Python 3.3:
>>> import string
>>> upper = set(string.ascii_uppercase)
>>> lower = set(string.ascii_lowercase)
>>> digits = set(string.digits)
>>> def check_psw(psw):
>>> letters = set(psw)
>>> return bool(len(psw) >= 8 and upper & letters and lower & letters and digits & letters)
Комментариев нет:
Отправить комментарий