我尝试制作一个'密码检查程序'来检查输入的变量是否包含特定字符。我需要它来检查你的东西:大写,小写和数字。 程序有望输出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
如果我看不到代码有什么问题,请指出。我被重新引导到其他问题,但它们对我来说太复杂了,人们会知道我已经复制了,这是不允许的。
非常感谢!
答案 0 :(得分:0)
答案 1 :(得分:0)
使用regex。它更容易。
您的代码没有按照您希望的方式运行,因为isupper
,islower
和isdigit
都会检查您提供的字符串的所有值。即'a'.islower()
返回True
,而'aA'.is lower()
返回False
。
所以,
if str.isupper() and str.islower():
#statement
永远不会被执行,因为其中一个条件总是被False
绑定。
注意: isupper
和islower
如果字符串中存在任何字符,则忽略任何数字。即'a6'.islower()
返回True
,而'6'.islower()
和'a6'.isdigit()
返回False
。
答案 2 :(得分:0)
isupper
/ islower
与isdigit
的工作方式不同。
上限和下限忽略任何数字和空格(例如“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)
我认为您可以将变量设置为标志,然后检查字母并逐个记录输入中出现的次数。