考虑以下正则表达式,它检查密码强度。它有开始和结束字符串锚点,以确保它匹配整个字符串。
pattern = re.compile(r'^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[$@$!%*#?&.])[A-Za-z\d$@$!%*#?&.]{8,}$')
while True:
user_pass = input('Enter a secure password: ')
if re.fullmatch(pattern, user_pass):
print('Successfully changed password')
break
else:
print('Not secure enough. Ensure pass is 8 characters long with at least one upper and lowercase letter, number,'
' and special character.')
我注意到Python 3.5有一个re.fullmatch(),看起来做同样的事情,但没有字符串锚:
pattern = re.compile(r'(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[$@$!%*#?&.])[A-Za-z\d$@$!%*#?&.]{8,}')
while True:
user_pass = input('Enter a secure password: ')
if re.fullmatch(pattern, user_pass):
print('Successfully changed password')
break
else:
print('Not secure enough. Ensure pass is 8 characters long with at least one upper and lowercase letter, number,'
' and special character.')
这是完全匹配的预期目的吗?是否有任何可能导致意外问题的情况?
答案 0 :(得分:3)
fullmatch()
函数和regex.fullmatch()
方法are new in Python 3.4。
更改日志非常明确:
这提供了一种明确匹配目标的方法 避免在代码中$字符丢失的一类微妙错误 更改或添加现有常规的替代方案 表达
因此,您使用它的方式确实是此功能的预期目的。它不会导致意外问题,^
和$
只是在内部谨慎添加。