簡體   English   中英

Python 密碼驗證:無法在正則表達式中使用字符串庫中的常量

[英]Python Password Validation: Unable to use constants from string library in regex

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]”進行硬編碼,我就成功了,但是現在如果我使用字符串庫常量,我會從第一次檢查中收到消息,而不管密碼中的任何其他錯誤。

你能告訴我我哪里錯了,語法上或語義上嗎?

常量只包含字符塊,但您想從中創建字符類。 這意味着您需要將所有這些都用[]括起來。 此外,您需要確保某些字符被轉義( ^-]\\ ),否則標點正則表達式將與您期望的不匹配。

所以,你需要更換string.ascii_lowercasef"[{string.ascii_lowercase}]" string.ascii_uppercasef"[{string.ascii_uppercase}]" string.digitsf"[{string.digits}]" , string.punctuation with f"[{string.punctuation.replace("\\\\", "\\\\\\\\").replace("-", r"\\-").replace("^", r"\\^").replace("]", r"\\]")}]"

如果您的 Python 環境早於 3.7 並且不支持字符串插值,請使用str.format ,例如if not re.search(r"[{}]".format(string.ascii_lowercase),pw)等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM