Нахождение повторения трех семейств 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

Надеюсь это поможет:)

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