该功能是找出密码有多强.如果:
有没有办法减少函数中的代码量?请帮我制作短于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)
虽然您已经有了答案,但我什至会尝试优化该模式。我不会.*再回溯,而是直接应用对比原则 :
(?=\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)