Отклонить пароль, если он содержит ровно 4 цифры (проверка)

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

  • минимум 2 заглавные буквы подряд
  • не имеет пробелов
  • содержит цифры
  • не содержит 4 последовательных цифр

{4} В настоящее время он отклоняет пароль, если он состоит из 4 и более цифр, но мне нужно, чтобы он отклонял пароль, состоящий ТОЧНО из 4 цифр.

s1 = 'annII#443'
s2 = 'annII#4343'
s3 = 'annII#43434'

pattern = r"^(?=.*[A-Z]{2,})(?=.*[A-Za-z])(?=.*[0-9])(?!.*[0-9]{4})(?!.*[\s]).*$"

re.findall(pattern, s1) # ['aШnnII#443']
re.findall(pattern, s2) # []
re.findall(pattern, s3) # []

PS: Это просто задача, так что не волнуйтесь. Он не будет использоваться для каких-либо реальных целей.

так что именно не так?

gog 20.11.2022 21:31

Вы имеете в виду ^(?=.*[A-Z]{2,})(?=.*[A-Za-z])(?=.*[0-9])(?!.*[0-9]{4})(?!.* ).*$ (обратите внимание на пробел ' ' вместо \s

Andrej Kesely 20.11.2022 21:32

отредактировал пост. я хочу, чтобы шаблон запрещал только s2, а не s2 и s3 (и другие строки, содержащие 4+ цифры

sash a 20.11.2022 21:40

Я чувствую, что стоит упомянуть, что это ужасные ограничения пароля. С какой стати вы запрещаете пробелы, или 4 цифры подряд, или требуете две заглавные буквы? Абсолютно чокнутые. И почему в год Господа нашего 2022 вы пытаетесь накатить собственное управление паролями?

Jared Smith 20.11.2022 21:41

@JaredSmith - Хотя я согласен с основным мнением (а не с доставкой); было бы полезнее привести примеры хороших ограничений, а не расплывчато критиковать текущие ограничения. Зачем катить свое? Образовательных целях. Отличный способ изучить основные основы.

S3DEV 20.11.2022 21:44

@ S3DEV Я согласен с вашим мнением и хотел бы дать толчок в лучшем направлении, но, возможно, это слишком большая тема для ТАКОГО ответа, а тем более ТАКОГО комментария. Я думаю, что ссылка на это, вероятно, является хорошим местом для начала ОП.

Jared Smith 20.11.2022 21:46

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

S3DEV 20.11.2022 21:50

Чтобы напрямую решить вашу проблему, строки, содержащие 5 чисел подряд, также содержат 4 числа подряд. Если вы хотите, чтобы эта часть регулярного выражения нашла ровно 4 числа без каких-либо других чисел рядом с ними, вам придется сделать что-то вроде этого (?!.*(?<![0-9])[0-9]{4}(?![0-9]))

CAustin 21.11.2022 00:35
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Анализ продукта магазина на Tokopedia
Анализ продукта магазина на Tokopedia
Tokopedia - это место, где продавцы могут продавать свои товары. Товар должен быть размещен на витрине, чтобы покупателям было легче найти товар...
0
8
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Чтобы соответствовать ровно четырем цифрам, вы можете использовать в начале ^, например. (?!(?:.*\D)?\d{4}(?!\d)).
    Это требует начала или \Dнецифры перед 4 цифрами и запрещает цифру после.
  2. (?=.*[A-Za-z]) выглядит излишним, если вам уже требуется (?=.*[A-Z]{2,}) (2 верхних).
  3. {2,} два и более избыточны. {2} было бы достаточно и не меняет логику.
  4. Вместо (?!.*[\s]).*$ вы можете просто использовать \S*$ (верхний соответствует не пробелам).
  5. Как правило, более эффективно использовать lazy .*? или даже инвертированный класс, где это возможно.
^(?=[^A-Z]*[A-Z]{2})(?=\D*\d)(?!(?:.*\D)?\d{4}(?!\d))\S*$

См. эту демонстрацию на regex101 (добавлено \n к отрицаниям в многострочной демонстрации, чтобы оставаться в очереди)

Другие вопросы по теме