我正在做一个密码检查器,我已经指定用户只能使用这 3 个特殊字符($,&,! 特殊 = ['$', '&', '!'] 但是当我输入#并且输出仍然是True时 我尝试使用 isdight 和 isalpha,
if not any(char in special for char in password):
return ('False')
val = False
if not password.isdigit():
return('False')
val = False
if not password.isalpha():
return('False')
val = False
但是情况不同,当我指定 3 个特殊字符 $,&,! 并且我输入其中一个即 $,输出仍然是 False ,与其他未批准的特殊字符相同,那么接下来我该怎么办?
我认为您希望您的代码看起来像这样:
special_chars = ['$', '&', '!']
password = input("Provide your password: ")
invalid = False
for char in password:
if char not in special_chars:
print('Invalid char found! Use only: {}'.format(special_chars))
invalid = True
break
if not invalid:
print('Valid password.')
我只是使用了 print 语句,因为我不确定它如何集成到您现有的代码中。要解释一下,您需要做的就是检查密码中的每个字符是否在您允许的特殊字符列表中。无需多次检查。
我假设你在问如何检查是否所有字符都是:
- 普通字母(阿尔法(
- 数字
- "$&!
您的代码分别检查这三个字符中的每一个,这意味着您首先要测试所有字符都是特殊字符之一,然后所有字符都是普通字母,最后测试所有字符都是数字。当然,情况永远不会如此,因为数字不能同时是一个字母和一个特殊字符。
要解决此问题,您需要使用or
,这将检查您的任何条件是否为 True。您还需要将not any(...)
更改为not all(...)
,以便在出现单个错误时失败,而不仅仅是在所有字符都不符合我们的条件时失败。您可以使用str.isalnum()
将步骤 2 和 3 合并为一个
if all(char in special or char.isalnum() for char in password):
val = False
return "False" # did you mean to return a string here?
这也可以通过正则表达式来完成:
[A-Za-z0-9$&!]+$
[A-Za-z0-9$&!]+
匹配 A-Z 范围内的任何大写或小写字符,或任何数字、$
或&
或!
一次或多次。$
匹配字符串的末尾(re.match
函数隐式匹配字符串的开头(。
代码:
import re
def test_password(password):
# use the following statement if you really want to return a string
# return 'True' if re.match('[A-Za-z0-9$&!]+$', password) else 'False'
return True if re.match('[A-Za-z0-9$&!]+$', password) else False
print(test_password('abC1!'))
print(test_password(''))
print(test_password('abC1#'))
指纹:
True
False
False
如果你宁愿