使用isupper,islower和isdigit

时间:2016-06-17 13:26:57

标签: python

我尝试制作一个'密码检查程序'来检查输入的变量是否包含特定字符。我需要它来检查你的东西:大写,小写和数字。 程序有望输出3件事,其中包括:

  • Weak,对于只有较高OR或仅较低OR的数字的密码

  • Medium,用于具有上限和下限,OR上限和数字,或更低和数字的密码

  • Strong,适用于同时包含上限,下限和数字的密码。

这是我的代码:

if EnteredPassword.isupper() or EnteredPassword.islower() or EnteredPassword.isdigit():
    print ("Your password is weak")
elif EnteredPassword.isupper()and EnteredPassword.islower():
    print ("Your password is medium")
elif EnteredPassword.isupper() and EnteredPassword.isdigit():
    print ("Your password is medium")
elif EnteredPassword.islower() and EnteredPassword.isdigit():
    print ("Your password is medium")
elif EnteredPassword.isupper() and EnteredPassword.islower() and EnteredPassword.isdigit():
    print ("Your password is strong")
else:
    print ("That password should not have been accepted")
    quit()

但是,当程序运行时,例如我放入UPPERLOWER6程序跳过else语句。如果我添加的内容只包含UPPER等,那么这是唯一可行的your password is weak

如果我看不到代码有什么问题,请指出。我被重新引导到其他问题,但它们对我来说太复杂了,人们会知道我已经复制了,这是不允许的。

非常感谢!

5 个答案:

答案 0 :(得分:0)

你应该这样做:

Password Tester in Python

您正在使用的功能测试整个字符串并使您想要做的事情不是正确的选择。

答案 1 :(得分:0)

使用regex。它更容易。

您的代码没有按照您希望的方式运行,因为isupperislowerisdigit都会检查您提供的字符串的所有值。即'a'.islower()返回True,而'aA'.is lower()返回False

所以,

if str.isupper() and str.islower():
    #statement

永远不会被执行,因为其中一个条件总是被False绑定。

注意: isupperislower如果字符串中存在任何字符,则忽略任何数字。即'a6'.islower()返回True,而'6'.islower()'a6'.isdigit()返回False

答案 2 :(得分:0)

isupper / islowerisdigit的工作方式不同。 上限和下限忽略任何数字和空格(例如“UPPER6”.isupper()为True) 另一方面,数字检查字符串是否只包含数字

无论如何'UPPERLOWER6'匹配第一个条件,所以它不应该跳到其他地方。你的字符串可能包含其他内容。

你仍然可以迭代字符,例如:

flags = [False] * 3

for ch in EnteredPassword:
  flags[0] = flags[0] or ch.islower()
  flags[1] = flags[1] or ch.isupper()
  flags[2] = flags[2] or ch.isdigit()

strength = sum(flags)
print("Your password is {}".format(
  ["not accepted", "weak", "medium", "strong"][strength])
)

答案 3 :(得分:0)

你做错了,因为你只能对字符而不是整个字符串使用isupper或islower函数。我会做这样的事情:

def containsOnlyUpper(s):
    for c in s:
        if(not c.isupper()):
            return False
    return True

def containsOnlyLower(s):
    for c in s:
        if(not c.islower()):
            return False
    return True

def containsOnlyNumber(s):
    for c in s:
        if(not c.isdigit()):
            return False
    return True

def containsUpperAndLower(s):
    hasUpper = False
    hasLower = False
    for c in s:
        if (c.islower()):
            hasLower = True
        if (c.isupper()):
            hasUpper = True

    if(hasUpper and hasLower):
        return True
    else:
        return False


def containsUpperAndNumber(s):
    hasUpper = False
    hasNumber = False
    for c in s:
        if (c.isupper()):
            hasUpper = True
        if (c.isdigit()):
            hasNumber = True

    if(hasUpper and hasNumber):
        return True
    else:
        return False

def containsLowerAndNumber(s):
    hasLower = False
    hasNumber = False
    for c in s:
        if (c.islower()):
            hasLower = True
        if (c.isdigit()):
            hasNumber = True

    if(hasLower and hasNumber):
        return True
    else:
        return False

def isWeakPassword(s):
    if(containsOnlyUpper(s) or containsOnlyLower(s) or containsOnlyNumber(s)):
        return True
    return False

def isMediumPassword(s):
    if(containsUpperAndLower(s) or containsUpperAndNumber(s) or containsLowerAndNumber(s)):
        return True
    return False

def isStrongPassword(s):
    hasUpper = False
    hasLower = False
    hasNumber = False
    for c in s:
        if (c.isupper()):
            hasUpper = True
        if (c.islower()):
            hasLower = True
        if (c.isdigit()):
            hasNumber = True

    if (hasLower and hasUpper and hasNumber):
        return True
    else:
        return False

password = "UPPERLOWER6"

if(isWeakPassword(password)):
    print "weak"
elif(isMediumPassword(password)):
    print "medium"
elif(isStrongPassword(password)):
    print "strong"
else:
    print "none"

答案 4 :(得分:0)

我认为您可以将变量设置为标志,然后检查字母并逐个记录输入中出现的次数。