python - Python密码验证:无法在正则表达式中使用字符串库中的常量
问题描述
def check_password(pw):
global reason
while True:
if not re.search(string.ascii_lowercase,pw):
flag = False
reason = get_error(4)
break
elif not re.search(string.ascii_uppercase, pw):
flag = False
reason = get_error(1)
break
elif not re.search(string.digits, pw):
flag = False
reason = get_error(2)
break
elif not re.search(string.punctuation, pw):
flag = False
reason = get_error(3)
break
else:
flag = True
print("Valid Password")
break
return flag
flag = False
min_length = 5
#password = input("Please enter your password:")
password = getpass.getpass("Enter Password:")
if len(password) >= min_length:
check_password(password)
print(password)
if flag == True:
print("Valid Password!")
else:
print(reason)
else:
print("Your password is not long enough.")
在这里,我使用正则表达式来验证密码。如果我对模式“[AZ]”、“[0-9]”进行硬编码,我就成功了,但是现在如果我使用字符串库常量,我会从第一次检查中得到消息,而不管密码中是否有任何其他错误。
你能告诉我我错在哪里,语法上还是语义上?
解决方案
常量只包含字符块,但你想用它们创建字符类。这意味着您需要用[
and将它们全部括起来]
。此外,您需要确保某些字符被转义(^
、-
和),否则标点正则表达式将]
与\
您期望的不匹配。
所以,你需要string.ascii_lowercase
用f"[{string.ascii_lowercase}]"
, string.ascii_uppercase
with f"[{string.ascii_uppercase}]"
, string.digits
with f"[{string.digits}]"
, string.punctuation
with替换f"[{string.punctuation.replace("\\", "\\\\").replace("-", r"\-").replace("^", r"\^").replace("]", r"\]")}]"
。
如果您的 Python 环境早于 3.7 并且不支持字符串插值,请使用str.format
, egif not re.search(r"[{}]".format(string.ascii_lowercase),pw)
等等。