Помощь в дописании регулярного выражения
Задачка с Codewars. Написать регулярное выражение, которое проверяет пароль, чтобы убедиться, что он соответствует следующим критериям:
- Его длина минимум 6 символов
- Содержит строчную и заглавную букву
- Содержит цифру
Допустимые символы - буквенно-цифровые (Не \, $ и т.д.)
Мой код:
regex=r"^[a-zA-Z0-9]{6,}$"
Проблема моего кода:
По условию задачи, правильный пароль должен содержать и строчную, и заглавную буквы! Пример неправильного пароля:ghdfj32 (Неправильный, потому что нет заглавной буквы). Еще неправильный: DSJKHD23 (Нет строчной буквы). Мой код возвращает True (т.к. в данных ранее паролях есть символы, которые указаны в квадратных скобках).
Мне нужно сделать так, чтобы регулярное выражение возвращало True только в том случае, если в проверяемом тексте есть как минимум по 1-му символу, данному в квадратных скобках ([a-zA-Z0-9])
Ответы (1 шт):
Используйте блоки предварительного просмотра:
^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])[a-zA-Z0-9]{6,}$
Допустимые, но менее эффективные альтернативы:
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{6,}$
^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,}$
Пример работы выражения №1 (обратите внимание на то, что в отрицающие символьные классы добавлен шаблон перехода на новую строку, так как в тесте используется многострочный текст, а не несколько отдельных строк) и пример работы выражений №2.
Подробности
^- начало строки(?=[^a-z]*[a-z])- положительный блок предварительного просмотра вперёд, который требует наличия 0 и более символов, отличных от строчных букв из набора ASCII (см.[^a-z]*), а затем одной такой буквы ([a-z]) сразу после текущей позиции в строке (выполняет требование "минимум одна строчная буква в строке")(?=[^A-Z]*[A-Z])- минимум одна прописная буква в строке(?=[^0-9]*[0-9])- минимум одна цифра в строке[a-zA-Z0-9]{6,}- шесть и более (см. ограничиващий квантификатор{6,}) повторов букв или цифр из набора ASCII$- конец строки.