我需要制作一个简单的密码检查器,它需要检查字符串是否至少有一个小写字母,一个大写字母和一个数字。
这里有我的
passwd = raw_input("enter your password: ")
upper = 0
lower = 0
number = 0
while len(passwd) < 7 and upper <= 0 and lower <= 0 and number <= 0:
print 'start'
for x in passwd:
if x.isupper()==True:
print 'upper'
upper+=1
elif x.islower()==True:
print 'lower'
lower+=1
elif x.isalpha()==False:
print 'num'
number+=1
print ('password not complex enough')
upper = 0
lower = 0
number = 0
passwd = raw_input('please enter password again ')
那些随机查看的打印件用于调试,因此我可以看到它到达的位置。
看起来正在发生的事情是它只检查第一个条件,长度条件然后离开循环。
这里是正在发生的事情的样本
enter your password: pA1
start
lower
upper
num
password not complex enough
please enter password again password
为什么只检查长度条件?我做错了什么?
答案 0 :(得分:7)
您可以使用unicodedata.category
来收集字符的类别,然后检查所有预期的字符是否存在,从而简化整个逻辑,例如:
import unicodedata
is_valid = (
len(password) >= 7 and
{'Ll', 'Lu', 'Nd'}.issubset(unicodedata.category(ch) for ch in password)
)
答案 1 :(得分:1)
您的检查逻辑存在一些问题。首先,在while
条件检查之前重新设置控制变量。此外,您使用and
来测试所有条件是否都为真,而or
是您应该使用的条件。如果您想保留代码的基本结构,最好的方法是在while语句中仅使用True
,然后在满足所有条件后使用break
循环。当然,如其他答案所示,有更复杂的方法可以检查是否满足所有条件。
passwd = raw_input("enter your password: ")
upper = 0
lower = 0
number = 0
while True:
for x in passwd:
if x.isupper()==True:
print 'upper'
upper+=1
elif x.islower()==True:
print 'lower'
lower+=1
elif x.isalpha()==False:
print 'num'
number+=1
if len(passwd) < 7 or upper <= 0 or lower <= 0 or number <= 0:
print ('password not complex enough')
passwd = raw_input('please enter password again ')
upper = 0
lower = 0
number = 0
else:
break
print 'final password:', passwd
输出:
enter your password: pA
lower
upper
password not complex enough
please enter password again pA1ghlfx78
lower
upper
num
lower
lower
lower
lower
lower
num
num
final password: pA1ghlfx78
答案 2 :(得分:1)
如果密码必须仅包含 ASCII字母和数字,那么最有效的方法是使用sets:
from string import ascii_lowercase, ascii_uppercase, digits
def is_valid(password):
if len(password) < 7:
return False
password_set = set(password)
return not any(password_set.isdisjoint(x)
for x in (ascii_lowercase, ascii_uppercase, digits))
如果允许使用unicode字符,则可以使用any()
:
def is_valid(password):
return (len(password) >= 7 and
any(c.islower() for c in password) and
any(c.isupper() for c in password) and
any(c.isdigit() for c in password))
答案 3 :(得分:-1)
愿这对您有所帮助。我使用sum(1 for c in the string if c.islower())
查找小写的总数。以及找到大写字母和数字。len(string)
的总数的相同方法来查找字符串的长度。
string=input()
if ((sum(1 for c in string if c.islower())>=1) and (sum(1 for c in string if
c.isupper())>=1) and (sum(1 for c in string if c.isdigit())>=1) and (len(string)>=7)):
print("Password is complex")
else:
print ("Password not complex enough")