python 接受 8 个字符密码的脚本仅满足以下条件:2 num、2 upper、2 lower 和 2 special

python script to accept 8 char password with these conditions only: 2 num, 2 upper, 2 lower, and 2 special

这就是我到目前为止所做的。当它出错时,它不会打印 'Not Okay'。我仍然无法弄清楚如何检查特殊字符。

#!/usr/bin/python

def passw_check():
    passin = raw_input("Enter the password")

    if len(passin) == 8:       # checking total length of password
        if sum(map(str.isupper, passin))== 2: #check 2 upper chars
            if sum(map(str.islower, passin))== 2:  #check 2 lower chars
                if sum(map(str.isdigit, passin))== 4:  #check 2 digits chars
                    print 'Passwords Okay'
                else: 
                    print 'Not Okay!'

passw_check()

只有最里面的 if 有一个 else 分支。使用 and 一次检查所有条件:

def passw_check():
    passin = raw_input("Enter the password")

    if (len(passin) == 8 and       # checking total length of password
        sum(map(str.isupper, passin)) == 2 and #check 2 upper chars
        sum(map(str.islower, passin)) == 2 and  #check 2 lower chars
        sum(map(str.isdigit, passin))== 4):  #check 2 digits chars
        print 'Passwords Okay'
    else: 
        print 'Not Okay!'
    return passin

passw = passw_check()

我可能会这样做:

#!/usr/bin/python
import string

def validate(s):
    def is_punc(c): return c in string.punctuation
    if len(s) != 8:                   return False
    if sum(map(str.isupper, s)) != 2: return False
    if sum(map(str.islower, s)) != 2: return False
    if sum(map(str.isdigit, s)) != 2: return False
    if sum(map(is_punc, s))     != 2: return False
    # Note of the tests have been violated, return True
    return True


def passw_check():
    passin = raw_input("Enter the password: ")

    if validate(passin):
        print 'Passwords Okay'
    else:
        print 'Not Okay!'

passw_check()

到这里,validate函数就很清晰了,逻辑也很容易理解。

另请注意,您说您只需要 2 个数字字符,但代码中的测试检查了 4 个。我将其更改为 2 以符合您的问题描述,请注意。

编辑 添加了 string.punctuation 测试而不是仅仅假设非字母数字字符是 "special" -- 如果你想要接受空格之类的东西/不想依赖于系统的语言环境。

您可以使用正则表达式,这应该验证 passin 有 2 个小写字母、2 个大写字母、2 个数字和 2 个特殊符号(您可以更改:

import re, string
def passw_check(passin):
    lower = "(?=.*[a-z].*[a-z])"
    upper = "(?=.*[A-Z].*[A-Z])"
    digit = "(?=.*[0-9].*[0-9])"
    special = "(?=.*[{0}].*[{0}])".format(re.escape(string.punctuation))
    return re.match("^.*{}{}{}{}.*$".format(lower, upper, digit, special), passin)

check = passw_check(raw_input("Enter the password"))
print("Password Okay" if check else "Not Okay!")