[英]Python Password Checker
我需要一些帮助来弄清楚如何使函数检查一堆条件的字符串。
密码必须至少5个字符长
密码必须包含至少一个大写字母
密码必须至少包含两个数字
密码中不得包含字符“ E”或“ e”
密码必须至少包含一个特殊符号:!,@,#,$,%,^,&
现在这就是我所拥有的
def passwordChecker(password):
'''
'''
caps = sum(1 for c in password if c.isupper())
nums = sum(1 for c in password if c.isdigit())
symb = any(c in password for c in '!@#$%^&')
note = any(c in password for c in 'Ee')
if len(password) <5:
return False
elif caps < 1:
return False
elif nums < 1:
return False
elif symb == False:
return False
else:
return True
编辑**
刚刚意识到,我还必须检查是否存在诸如“ password”或“ 111111”之类的常用密码,而我真的不知道该如何处理。
只是使用正则表达式的一种替代方法:
import re
def passwordChecker(password):
return all(re.search(pattern, password) for pattern in
('.{5}', '[A-Z]', '\d.*\d', '^[^Ee]*$', '[!@#$%^&]'))
演示使用五个几乎无效和五个几乎无效的测试(五个规则中的每个规则一个无效和一个有效):
for password in ('1A!', '12!34', 'A1bc!', 'A12E!', 'A12bc',
'1A!2.', 'A2!34', 'A12c!', 'A12b!', 'A12b@'):
print(passwordChecker(password))
前五个打印为False
,后五个打印为True
。
你只是想念一个分支
elif note:
return False
在else:
之前else:
这是谈论装饰者的好时机! 我喜欢使用装饰器来验证数据, 可能太多了 。 您可以对所有内容进行验证,并将其包装在get_password
方法周围。
def v_length(password):
return len(password) >= 5
def v_upper(password):
return password.lower() != password
def v_2_nums(password):
return sum(c.isdigit() for c in password) >= 2
def v_no_e(password):
return "e" not in password.lower()
def v_specialchar(password):
any(s in password for s in "!@#$%^&")
def validator(*tests):
def wrap(func):
def wrapped(*args, **kwargs):
result = func(*args, **kwargs)
if not all(test(result) for test in tests):
# fail the input somehow -- how??
return result
return wrapped
return wrap
@validator(v_length, v_upper, v_2_nums, v_no_e, v_specialchar)
def get_password():
pwd = input("Enter your password: ")
当我用真实代码执行此操作时,我喜欢将验证器包装在自己的工厂中,以便更轻松地针对每个应用程序进行更改
def v_length(min_length):
def wrapped(password):
return len(password) >= min_length
return wrapped
@validator(v_length(8))
def get_weak_password():
input("Enter your wussy password: ")
@validator(v_length(64))
def get_strong_password():
input("Enter your Herculean password: ")
第二种方法很好地用于检查常用密码。
def v_common(common_pwd_set):
def wrapped(password):
return password not in common_pwd_set
return wrapped
COMMON_PASSWORDS = {"hunter2", "111111", "password"}
@validator(v_common(COMMON_PASSWORDS))
def get_password():
pwd = input("Use a tricksy one! ")
以下检查每个故障情况是否短路(一旦发现故障,它将停止检查)。 “通用”密码并不是很常见,但是我想要可以通过其余检查的值。
def passwordChecker(password):
'''
A password checker. Returns True if the password is acceptable; False otherwise.
'''
if (len(password) < 5 or
not any(c.isupper() for c in password) or
sum(c.isdigit() for c in password) < 2 or
'e' in password.lower() or
not (set(password) & set('!@#$%^&')) or
password in {'Password12!', 'Passwd12!'}):
return False
return True
>>> passwordChecker('Password12!')
False
>>> passwordChecker('hi')
False
>>> passwordChecker('H12!')
False
>>> passwordChecker('Hi12!')
True
还有另一种方式...
def passwordChecker(password):
return (len(password) > 4 and
len(filter(str.isupper, password)) > 0 and
len(filter(str.isdigit, password)) > 1 and
'e' not in password.lower() and
any(special in password for special in '!@#$%^&') and
password not in ('password', '111111'))
我认为我的解决方案中最有趣的部分是使用filter
; 有些人喜欢它,另一些人讨厌它。 无论如何,所有其他解决方案也能正常工作。 只是以为我会为了完整性而把这一个混在一起。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.