【问题标题】:How to detect a special character in password-string in python如何在python中检测密码字符串中的特殊字符
【发布时间】:2021-07-08 19:58:14
【问题描述】:

我正在制作一个程序,您可以在其中向数据库添加密码。密码应包含一个大写、一个小写、一个数字、一个特殊字符,并且应该在 8 到 30 个字符之间。除特殊字符部分外,其余部分有效。我在字符串中放了一个特殊字符,但我的程序仍然告诉我它没有特殊字符。我不确定我在这里做错了什么:

specialCharacters = "~!@#$%^&*_-+=`|\(){}[]:;'<>,.?/"

def checkPassword(password):
    global specialCharacters
    errorString = ""
    if(len(password) < 8 or len(password) > 30):
        errorString = "ERROR: Your password must be between 8 and 30 characters"
        print(errorString)
        return False
    elif(any(char.isalpha() for char in password) == False):
        errorString = ("ERROR: password must contain at least letter")
        print(errorString)
        return False
    elif(any(char.isupper() for char in password) == False):
        errorString = ("ERROR: password must contain at least one uppercase")
        print(errorString)
        return False
    elif(any(char.islower() for char in password) == False):
        errorString = ("ERROR: password must contain at least one lowercase")
        print(errorString)
        return False
    elif(any(char.isdigit() for char in password) == False):
        errorString = ("ERROR: password must contain at least one digit")
        print(errorString)
        return False
    for ch in password:                   /// here is the problem
        if ch not in specialCharacters:
            errorString = "ERROR: password must contain at least one special character"
            print(errorString)
            return False
    else:
        return True


checkPassword("Hellooooo1*") // returns "ERROR: password must contain at least one special character", why? 



【问题讨论】:

  • len(set(password).intersection(specialCharacters)) &gt;0
  • 'H' 不在specialCharacters 中。 'e' 不在 specialCharacters 中。 'l' 不在specialCharacters....
  • @Epsi95 我需要在 if 语句中这样做吗?
  • @JohnnyMopp 嗯,好吧,我尝试在 for 循环中切换变量密码和特殊字符,但仍然没有解决它:(。那么“*”不在“密码”中
  • 您可以使用第一条评论或类似的方法:len(set(specialCharacters) &amp; set(password)) &gt; 0

标签: python if-statement


【解决方案1】:

首先,您要检查密码中的每个字符是否是不在中的特殊字符 - 如果该字符串中没有出现任何特殊字符,则执行 if 语句密码被拒绝。

要重新工作,您不需要显式循环,可以使用 all 关键字:

...
elif all(x not in specialCharacters for x in password):
    errorString = "ERROR: password must contain at least one special character"
    print(errorString)
    return False
return True

【讨论】:

  • 这样,所有特殊字符都应该存在
  • @Sujay 它要求至少存在一个 - 如果每个元素都为 True,则所有返回 true,否则返回 False。对于“a*”,我们有 all([True, False])==False(接受密码),对于“ab”,我们有 all([True, True])==True(拒绝密码)。
【解决方案2】:

您的代码中有错误。检查特殊字符的最后一个块仅检查第一个字符并在那里失败。判断前需要遍历完整的字符串。

specialCharacters = "~!@#$%^&*_-+=`|\(){}[]:;'<>,.?/"

def checkPassword(password):
    global specialCharacters
    errorString = ""
    if(len(password) < 8 or len(password) > 30):
        errorString = "ERROR: Your password must be between 8 and 30 characters"
        print(errorString)
        return False
    elif(any(char.isalpha() for char in password) == False):
        errorString = ("ERROR: password must contain at least letter")
        print(errorString)
        return False
    elif(any(char.isupper() for char in password) == False):
        errorString = ("ERROR: password must contain at least one uppercase")
        print(errorString)
        return False
    elif(any(char.islower() for char in password) == False):
        errorString = ("ERROR: password must contain at least one lowercase")
        print(errorString)
        return False
    elif(any(char.isdigit() for char in password) == False):
        errorString = ("ERROR: password must contain at least one digit")
        print(errorString)
        return False
    else:
        special_found = False
        for ch in password:                   
            if ch in specialCharacters:
                speical_found = True
        return speical_found

print(checkPassword("Hellooooo1*")) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多