使用Python进行密码验证

使用Python进行密码验证,python,while-loop,passwords,Python,While Loop,Passwords,我正在尝试制作一个代码来验证你进入程序的密码。密码长度应至少为6个字符,包含1个大写字母、1个小写字母、1个数字和1个标点符号。这就是我现在所拥有的: def main(): while True: password = input("Please enter the desired password: ") if not password.islower(): print("This is NOT a valid passwor

我正在尝试制作一个代码来验证你进入程序的密码。密码长度应至少为6个字符,包含1个大写字母、1个小写字母、1个数字和1个标点符号。这就是我现在所拥有的:

def main():
    while True:
        password = input("Please enter the desired password: ")
        if not password.islower(): 
            print("This is NOT a valid password.")
        elif not password.isupper(): 
            print("This is NOT a valid password.")
        elif not password.isdigit():
            print("This is NOT a valid password.")
        elif not len(password) < 6:
            print("This is NOT a valid password.")
        else:
            print("This is a valid password.")
            break
main() 
def main():
尽管如此:
密码=输入(“请输入所需密码:”)
如果不是密码。islower():
打印(“这不是有效的密码。”)
elif不是密码。isupper():
打印(“这不是有效的密码。”)
elif不是密码。isdigit():
打印(“这不是有效的密码。”)
elif not len(密码)<6:
打印(“这不是有效的密码。”)
其他:
打印(“这是一个有效的密码。”)
打破
main()

出于某种原因,即使我写了一个有效的密码,它也会一直打印出密码无效,有人知道为什么会发生这种情况吗?。此外,如何使代码检测到我编写的密码中至少有1个标点符号?谢谢大家!

您的代码做错了。也就是说,您正在检查整个密码是否较低,然后再次检查整个密码是否较高。由于这个原因,它总是显示
无效
。但您需要检查的是,密码是否包含单个小写字符,是否包含单个大写字符,是否包含单个数字,长度至少应为6

为此,必须使用
any()
,如果iterable中的任何项为True,则返回True,否则返回False

def main():
while True:
    password = input("Please enter the desired password: ")
    if not any(p.islower() for p in password): 
        print("This is NOT a valid password")
    elif not any(p.isupper() for p in password): 
        print("This is NOT a valid password")
    elif not any(p.isdigit() for p in password):
        print("This is NOT a valid password")
    elif len(password) < 6:
        print("This is NOT a valid password")
    else:
        print("This is a valid password")
        break
main() 
def main():
尽管如此:
密码=输入(“请输入所需密码:”)
如果没有(p.islower()表示密码中的p):
打印(“这不是有效的密码”)
elif not any(p.isupper()表示密码中的p):
打印(“这不是有效的密码”)
elif not any(p.isdigit()表示密码中的p):
打印(“这不是有效的密码”)
elif len(密码)<6:
打印(“这不是有效的密码”)
其他:
打印(“这是一个有效的密码”)
打破
main()

您的代码做错了。也就是说,您正在检查整个密码是否较低,然后再次检查整个密码是否较高。由于这个原因,它总是显示
无效
。但您需要检查的是,密码是否包含单个小写字符,是否包含单个大写字符,是否包含单个数字,长度至少应为6

为此,必须使用
any()
,如果iterable中的任何项为True,则返回True,否则返回False

def main():
while True:
    password = input("Please enter the desired password: ")
    if not any(p.islower() for p in password): 
        print("This is NOT a valid password")
    elif not any(p.isupper() for p in password): 
        print("This is NOT a valid password")
    elif not any(p.isdigit() for p in password):
        print("This is NOT a valid password")
    elif len(password) < 6:
        print("This is NOT a valid password")
    else:
        print("This is a valid password")
        break
main() 
def main():
尽管如此:
密码=输入(“请输入所需密码:”)
如果没有(p.islower()表示密码中的p):
打印(“这不是有效的密码”)
elif not any(p.isupper()表示密码中的p):
打印(“这不是有效的密码”)
elif not any(p.isdigit()表示密码中的p):
打印(“这不是有效的密码”)
elif len(密码)<6:
打印(“这不是有效的密码”)
其他:
打印(“这是一个有效的密码”)
打破
main()

函数
islower()
isupper()
isdigit()
检查字符串的所有元素是否满足该条件。因此,当您使用例如,
islower()
时,您正在检查字符串中的所有字符是否都是小写

对于这种情况,我将使用正则表达式检查每个条件。使用正则表达式,您可以自定义要检查的所有规则,学习起来并不困难(请参阅文档)

一个使用你所拥有的东西的例子是

import re

password = input('Write a password: ')

if re.search('[A-Z]+', password) is None:
    print('invalid password!')
elif re.search('[a-z]+', password) is None:
    print('invalid password!')
elif re.search('[0-9]+', password) is None:
    print('invalid password!')
elif re.search('[' + string.punctuation + ']+', password) is None:
    print('invalid password!')
elif len(password) < 6
    print('invalid password!')
else:
    print('valid password!!')
重新导入
密码=输入('写入密码:')
如果重新搜索(“[A-Z]+”,密码)为无:
打印('无效密码!')
elif重新搜索(“[a-z]+”,密码)为无:
打印('无效密码!')
elif重新搜索(“[0-9]+”,密码)为无:
打印('无效密码!')
elif re.search(“[”+字符串.标点符号+“]+”,密码)为无:
打印('无效密码!')
elif len(密码)<6
打印('无效密码!')
其他:
打印('有效密码!!')

函数
islower()
isupper()
isdigit()
检查字符串的所有元素是否满足该条件。因此,当您使用例如,
islower()
时,您正在检查字符串中的所有字符是否都是小写

对于这种情况,我将使用正则表达式检查每个条件。使用正则表达式,您可以自定义要检查的所有规则,学习起来并不困难(请参阅文档)

一个使用你所拥有的东西的例子是

import re

password = input('Write a password: ')

if re.search('[A-Z]+', password) is None:
    print('invalid password!')
elif re.search('[a-z]+', password) is None:
    print('invalid password!')
elif re.search('[0-9]+', password) is None:
    print('invalid password!')
elif re.search('[' + string.punctuation + ']+', password) is None:
    print('invalid password!')
elif len(password) < 6
    print('invalid password!')
else:
    print('valid password!!')
重新导入
密码=输入('写入密码:')
如果重新搜索(“[A-Z]+”,密码)为无:
打印('无效密码!')
elif重新搜索(“[a-z]+”,密码)为无:
打印('无效密码!')
elif重新搜索(“[0-9]+”,密码)为无:
打印('无效密码!')
elif re.search(“[”+字符串.标点符号+“]+”,密码)为无:
打印('无效密码!')
elif len(密码)<6
打印('无效密码!')
其他:
打印('有效密码!!')

试着用英语解释一下,你希望每个条件都能达到什么目的。例如:
如果不是password.islower():
您希望哪些值与此条件匹配(因此无效)?您希望哪些值与此条件不匹配(以便检查其他值)?现在,尝试验证一下。例如,您可以为每个“无效密码”行使用不同的消息,以便查看满足了哪些条件。将
elif NOT len(password)<6:
更改为
elif len(password)<6:
@KarlKnechtel With
if NOT password.islower():
我希望它能够检测到