如何检查字符串是否包含小写字母,大写字母和数字

时间:2017-08-25 09:23:48

标签: python

我需要制作一个简单的密码检查器,它需要检查字符串是否至少有一个小写字母,一个大写字母和一个数字。

这里有我的

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

为什么只检查长度条件?我做错了什么?

4 个答案:

答案 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")