唯一匹配的特殊字符位置是密码的结尾。如果特殊字符位于开头或结尾以外的任何地方,它将无法匹配并拒绝密码。
import re
while True:
password = input("Please enter a password containing at least 6 letters, \n "
"one number, one capital letter, and at least one special character. ")
pattern = r"[A-Z]+?[A-Za-z]{6,}?[0-9]+?[^a-zA-Z0-9]+?"
if not re.search(pattern, password):
print("Please try again")
else:
print("Your new password is: ", password)
break
我想接受包含特殊字符和数字的密码,密码包含在其中的任何地方,而不仅仅是结尾处,例如
@#$Chuckles23
Chuck#$les23
23Chuckles@#$
我尝试使用其他答案中建议的正则表达式代码,但到目前为止,它们都不适合我的情况。
答案 0 :(得分:3)
尝试在密码正则表达式模式中使用先行提示
pattern = r'^(?=.*[0-9])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{6,}$'
if not re.search(pattern, password):
print("Please try again")
以下是正则表达式模式的简要说明:
^ from the start of the password
(?=.*[0-9]) assert that at least one digit is present
(?=.*[A-Z]) assert that at least one capital letter is present
(?=.*[^a-zA-Z0-9]) assert one special character
.{6,} then match any 6 or more characters
$ end of the password
答案 1 :(得分:0)
这可以通过先行完成。可以通过以下方式提前检查每个条件:
(?=.*[A-Z])(?=(?:.*[A-Za-z]){6,})(?=(?:.*[0-9]))(?=(?:.*[^a-zA-Z0-9])).*
除了re.match
之外,您还可以使用re.fullmatch
和re.search
作为验证者。
可以使用lookbehinds获得等效表达式:
.*(?<=.*[A-Z])(?<=(?:.*[A-Za-z]){6,})(?<=(?:.*[0-9]))(?<=(?:.*[^a-zA-Z0-9]))
您甚至可以混合搭配:
(?=.*[A-Z])(?=(?:.*[A-Za-z]){6,}).*(?<=(?:.*[0-9]))(?<=(?:.*[^a-zA-Z0-9]))
从功能上讲,这些方法都是等效的。差异主要是美学上的差异,尽管当然也可能存在一些实现细节,这些细节也会导致较小的时序差异。