如何在Python中测试正则表达式密码?
在Python中使用正则表达式,如何检查用户的密码是否符合以下要求:
- 至少8个字符
- 可以包含,但不强制要求以下任意内容:
- 大写字母:A-Z
- 小写字母:a-z
- 数字:0-9
- 特殊字符:@#$%^&+=
需要注意的是,所有的字母、数字和特殊字符都是可选的。我只想确认密码至少有8个字符,并且可以包含字母、数字或特殊字符。用户可以根据自己的选择来决定密码的强度或弱度。
到目前为止,我的代码是:
import re
pattern = "^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$"
password = raw_input("Enter string to test: ")
result = re.findall(pattern, password)
if (result):
print "Valid password"
else:
print "Password not valid"
8 个回答
3
好的,这里是我不使用正则表达式的解决方案(还需要一些改进):
#TODO: the initialization below is incomplete
hardCodedSetOfAllowedCharacters = set(c for c in '0123456789a...zA...Z~!@#$%^&*()_+')
def getPassword():
password = raw_input("Enter string to test: ").strip()
if (len(password) < 8):
raise AppropriateError("password is too short")
if any(passChar not in hardCodedSetOfAllowedCharacters for passChar in password):
raise AppropriateError("password contains illegal characters")
return password
5
我同意Hammish的看法。不要用正则表达式来处理这个问题。应该为每一个测试写一个独立的函数,然后按顺序调用它们。明年当你想要密码至少包含2个大写字母和2个小写字母时,你会发现修改那个正则表达式非常麻烦。
另一个原因是为了让用户可以自定义设置。假设你把程序卖给了一个需要12个字符密码的人。修改一个单独的函数来处理系统参数要比修改一个正则表达式简单得多。
// pseudo-code
Bool PwdCheckLength(String pwd)
{
Int minLen = getSystemParameter("MinPwdLen");
return pwd.len() < minlen;
}
37
import re
password = raw_input("Enter string to test: ")
if re.fullmatch(r'[A-Za-z0-9@#$%^&+=]{8,}', password):
# match
else:
# no match
这里的 {8,}
是说“至少要有8个”。而 .fullmatch
这个函数要求整个字符串都要和整个正则表达式匹配,而不是只匹配一部分。