2015-06-03 76 views
2

我需要一些帮助,弄清楚如何使一个函数检查一串条件的字符串。Python密码检查器

  • 密码必须长至少5个字符

  • 密码必须包含至少一个大写字母

  • 密码必须包含至少两个数字

  • 密码不能包含字符“E”或“e”

  • 密码必须包含t个最低一个特殊符号:!,@,#,$,%,^,&

现在这一切,我有

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 '[email protected]#$%^&') 
    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 

编辑**

刚刚意识到我还必须检查是否有常用的密码,如'密码'或'111111',我真的不知道我会如何处理这个问题。

import re 
def passwordChecker(password): 
    return all(re.search(pattern, password) for pattern in 
       ('.{5}', '[A-Z]', '\d.*\d', '^[^Ee]*$', '[[email protected]#$%^&]')) 

使用五个几乎无效,五个几乎没有有效的测试演示(之一:

+1

您忘记检查'note == False' –

+0

而'nums'应该是'nums <2'而不是 –

+0

您需要确定哪些值有资格作为常用密码,然后检查它们。 – TigerhawkT3

回答

1

您使用正则表达式只是缺少一个分支

elif note: 
    return False 

else:

+0

我总是得到一个虚假的回报,这是我无法弄清的 –

+1

我尝试了你的原始代码以及这个加法,并且我并不总是会得到'False'。也许你没有选择一个可接受的密码? – TigerhawkT3

2

只是一个替代之前无效,一个有效的五个规则):

for password in ('1A!', '12!34', 'A1bc!', 'A12E!', 'A12bc', 
       '1A!2.', 'A2!34', 'A12c!', 'A12b!', '[email protected]'): 
    print(passwordChecker(password)) 

打印False前五个和True为最后五个。

0

以下内容将检查每个故障情况并进行短路(一旦发现故障,它将停止检查)。 “通用”密码并不常见,但我想要的值可以通过其余的检查。

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('[email protected]#$%^&')) or 
     password in {'Password12!', 'Passwd12!'}): 
     return False 
    return True 

>>> passwordChecker('Password12!') 
False 
>>> passwordChecker('hi') 
False 
>>> passwordChecker('H12!') 
False 
>>> passwordChecker('Hi12!') 
True 
1

这是谈装修的好时机!我使用装饰器验证数据,probably too much。你可以为所有这些做验证器,并将其包装在你的方法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 "[email protected]#$%^&") 

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! ") 
0

另一种方式来做到这一点...

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 '[email protected]#$%^&') and 
      password not in ('password', '111111')) 

我觉得我的解决方案中最有趣的部分是使用filter;有些人喜欢它,有些则讨厌它。无论如何,所有其他解决方案的工作也是如此。只是以为我会把这个完整的混合在一起。