Python Regex: пароль должен содержать хотя бы одну заглавную букву и число

Я делаю проверку формы для пароля с помощью Python и Flask. Пароль должен содержать хотя бы одна заглавная буква и не менее одно число.

моя текущая неудачная попытка...

re.compile(r'^[A-Zd]$')

4 ответов


мы можем использовать шаблон '\d.*[A-Z]|[A-Z].*\d' для поиска записей, имеющих хотя бы одну заглавную букву и одно число. Логически говоря, есть только два способа, которыми заглавная буква и число могут отображаться в строке. Либо письмо приходит первым, а число после, либо число первым и буква после.

труба | означает "или", Поэтому мы рассмотрим каждую сторону отдельно. \d.*[A-Z] соответствует номеру, за которым следует заглавная буква,[A-Z].*\d соответствует любой заглавной букве за этим следует число.

words = ['Password1', 'password2', 'passwordthree', 'P4', 'mypassworD1!!!', '898*(*^$^@%&#abcdef']
for x in words:
    print re.search('\d.*[A-Z]|[A-Z].*\d', x)
#<_sre.SRE_Match object at 0x00000000088146B0>
#None
#None
#<_sre.SRE_Match object at 0x00000000088146B0>
#<_sre.SRE_Match object at 0x00000000088146B0>
#None

другой вариант-использовать lookahead.

^(?=.*?[A-Z]).*\d

посмотреть демо на regex101

lookahead на ^ start проверяет, если [A-Z] впереди. Если это соответствует цифре.


регулярные выражения не имеют оператора AND, поэтому довольно сложно написать регулярное выражение, которое соответствует действительным паролям, когда действительность определяется чем-то и чем-то еще и чем-то еще.

но регулярные выражения имеют оператор OR, поэтому просто примените теорему деморгана и напишите регулярное выражение, которое соответствует недопустимым паролям:

ничего без номеров или ничего без заглавных

Так:

^([^0-9]*|[^A-Z]*)$

если что-нибудь соответствует этому, тогда это неверный пароль.


чтобы соответствовать строке, содержащей по крайней мере один символ цифры, используйте:

.*[0-9].*

аналогичное регулярное выражение применяется для проверки верхнего / нижнего регистра.