首页 > 解决方案 > 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]”进行硬编码,我就成功了,但是现在如果我使用字符串库常量,我会从第一次检查中得到消息,而不管密码中是否有任何其他错误。

你能告诉我我错在哪里,语法上还是语义上?

标签: pythonregexstring

解决方案


常量只包含字符块,但你想用它们创建字符类。这意味着您需要用[and将它们全部括起来]。此外,您需要确保某些字符被转义(^-和),否则标点正则表达式将]\您期望的不匹配。

所以,你需要string.ascii_lowercasef"[{string.ascii_lowercase}]", string.ascii_uppercasewith f"[{string.ascii_uppercase}]", string.digitswith f"[{string.digits}]", string.punctuationwith替换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)等等。


推荐阅读