Нахождение повторения трех семейств ASCII в строке
Я пытаюсь создать систему "проверки" для генератора паролей, которая сообщит, найдены ли в строке сгенерированного пароля три одинаковых семейства символов, т.е.
Если пароль
y8kpBD8zcZLKRSh1j7vwCMDQ5orR8VEP
он найдет "ZLK" и т. д.
Я сначала подумала lowercase_repeat = re.compile("[a-z]{3}")
например, нашел бы три повторения в нижнем регистре, но я не могу понять, как это работает точно.
Генератор паролей ниже:
import random
import re
generator = random.SystemRandom()
password_characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789!@#$%^&*()'
password = ''.join(generator.choice(password_characters) for _ in range(32))
print password
1 ответ
Если вы просто хотите проверить наличие определенных наборов символов; Например: все прописные, все строчные, цифры и не-знаки - вы можете создать группу без захвата для каждого набора. Например:
import re
pattern = '(?:[a-z]{3}|[A-Z]{3}|\d{3}|[\x20-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]{3})'
password = 'y8kpBD8zcZLKRSh1j7vwCMDQ5orR8VEP!'
matches = re.search(pattern, password)
Переменная matches
возвращается None
если совпадений нет, с указанием пароля проходит.
Шаблон [\x20-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]
это (вероятно, довольно грубый) способ поймать набор всех не alnum символов ascii (шестнадцатеричные коды). Он представляет собой следующий набор:
[пространство]! " # $ % & ' () * +, - . /:; < = >? @ [ \ ] ^ _ ` { | } ~
Я вытащил его из старого проекта, так что YMMV. Я уверен, что может быть более краткий способ выразить это - действительно, вы могли бы предпочесть явно указать набор; например: [!?#]
и т.п.
Быстрая проверка работоспособности:
import re
def check_password(password):
pattern = '(?:[a-z]{3}|[A-Z]{3}|\d{3}|[\x20-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]{3})'
return re.search(pattern, password)
passwords = ['a', 'abc', 'ABC', 'aBc', '1bc', '123']
for password in passwords:
if check_password(password):
print 'password failed: ', password
else:
print 'password passed: ', password
Урожайность:
password passed: a
password failed: abc
password failed: ABC
password passed: aBc
password passed: 1bc
password failed: 123
Надеюсь это поможет:)