Python Regex для числа раз появления цифр, алфавита - PullRequest
2 голосов
/ 09 ноября 2019

Я пытаюсь написать регулярное выражение для проверки токена.

my token has a following structure:

  • 3 или более [0-9] digits
  • 5 или более [az] small alpha
  • 2 или более [# @] special characters
  • 5 или более [AZ] upper alpha (необязательно ?) могут существоватьили нет.

Примечание: необязательные символы [AZ] могут присутствовать в некоторых токенах, но могут отсутствовать в некоторых, а если они существуют в токене, они должны быть между 5 or more разами.

  • длина токена варьируется от minimum of 6 to a max of 30

нескольких примеров допустимых / недействительных совпадений:

token1 : t4xa@ui13p#o6
breakdown : there are 7 [a-z] , 2 special chracter[@#] , 4 digits [0-9]
VALID MATCH: True

token2: 3@piy13Qx9#13@z1337
breakdown: there are 5 [a-z] , 3 special character [@#] , 10 digits [0-9] and 1 [A-Z](which is optional)
VALID MATCH: False (because `[A-Z]` exist in token but it exist for `1` time, it should exist atleast of 5 or more.)

token3: 3@piy1ABC3Qx9#13@DEGFz1337
breakdown: there are 5[a-z], 7 [A-Z] , 10 digits [0-9]
VALID MATCH: True
  • Пока мне удалосьнаписать регулярное выражение для проверки как минимум одной цифры, одной заглавной буквы, хотя бы одной строчной буквы, хотя бы одного специального символа.
^(?=.*[\d])(?=.*[A-Z])(?=.*[a-z])(?=.*[@#])[\w\d@#]{6,30}$

1 Ответ

3 голосов
/ 09 ноября 2019

Если есть либо ноль, либо 5 заглавных букв, то вы можете использовать положительный прогноз, чтобы утверждать, что нет заглавных букв или хотя бы 5 раз.

(?=(?:[^A-Z\s]*$|(?:[^A-Z\s]*[A-Z]){5})

Вы можете использовать отрицательные классы символов и квантификаторыпроверить минимальное количество вхождений.

^(?=(?:[^\d\s]*\d){3})(?=(?:[^a-z\s]*[a-z]){5})(?=(?:[^@#\s]*[@#]){2})(?=(?:[^A-Z\s]*$|(?:[^A-Z\s]*[A-Z]){5}))[\w\d@#]{6,30}$

Regex demo

...