用正则表达式检查密码的强度

use*_*216 5 python regex

该功能是找出密码有多强.如果:

  1. 长度大于或等于10个字符
  2. 它至少包含一个数字
  3. 至少有一个大写字母
  4. 一个小写字母
  5. 密码只能包含ASCII拉丁字母或数字

有没有办法减少函数中的代码量?请帮我制作短于200个字符的函数代码(尽量解决而不给变量赋值)

import re
def golf(password):
    if len(password) >=  10 \
    and re.search("^[a-zA-Z0-9]+", password) \
    and re.search("[a-z]+", password) \
    and re.search("[A-Z]+", password) \
    and re.search("[0-9]+", password):
        print(password, True)
        return True
    else:
        print(password, False)
        return False


if __name__ == '__main__':
    golf('A1213pokl') == False
    golf('bAse730onE') == True
    golf('asasasasasasasaas') == False
    golf('QWERTYqwerty') == False
    golf('123456123456') == False
    golf('QwErTy911poqqqq') == True
    golf('..........') == False
Run Code Online (Sandbox Code Playgroud)

Jan*_*Jan 3

虽然您已经有了答案,但我什至会尝试优化该模式。我不会.*再回溯,而是直接应用对比原则

(?=\D*\d)          # NOT a number, 0+ times, then one number
(?=[^A-Z]*[A-Z])   # NOT an UPPERCASE, 0+times, then an UPPERCASE
(?=[^a-z]*[a-z])   # same with lowercase
^[A-Za-z0-9]{10,}$ # allowed characters, 10+, with anchors on both sides
Run Code Online (Sandbox Code Playgroud)

浓缩和演示

(?=\D*\d)(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])[A-Za-z0-9]{10,}$
Run Code Online (Sandbox Code Playgroud)

这里的想法是,虽然.*让你下线然后回溯,但上面的模式可能会更快结束。


最后是Python片段:

import re

def golf(password=None):
    rx = re.compile(r'(?=\D*\d)(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])[A-Za-z0-9]{10,}$')
    return True if rx.match(password) else False

passwords = ['A1213pokl', 'bAse730onE', 'asasasasasasasaas', 'QWERTYqwerty', '123456123456', 'QwErTy911poqqqq', '..........']
vectors = [golf(password) for password in passwords]
print(vectors)
# [False, True, False, False, False, True, False]
Run Code Online (Sandbox Code Playgroud)