在字符串

时间:2015-08-23 10:58:17

标签: python string character ascii recurring

我正试图创建一个“检查”。密码生成器的系统,它将建议在生成的密码中是否连续找到三个相同类型的字符系列,即

如果密码是

  

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 个答案:

答案 0 :(得分:1)

如果您只想检查特定的字符集;例如:全部大写,全部小写,数字和非alnum - 您可以为每个集创建一个非捕获组。例如:

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

希望这会有所帮助:)