如果要校验用户密码,有两种写法。
写法1:多个正则校验
def check_password(password):
if not 6 <= len(password) <= 20:
return False, "密码必须在6~20之间"
if not re.findall(r"[a-z]", password):
return False, "必须包含至少1个小写字母"
if not re.findall(r"[A-Z]", password):
return False, "必须包含至少1个大写字母"
if not re.findall(r"[0-9]", password):
return False, "必须包含至少1个数字"
if not re.findall(r"[^0-9a-zA-Z]", password):
return False, "必须包含至少1个特殊字符"
return True, None
这样写的好处:每种错误都能单独提示;
但这样的缺点,是写了很多个正则,性能有问题。
如果不需要这么详细的错误信息,想要判断密码是否正确是否可以?
但是遇到个问题,我怎么知道顺序是[小写大写数字]、[大写小写数字]、[数字小写大写]这哪一种?
方法就是正则的高级用法Positive and Negative Lookahead
写法2:使用Positive and Negative Lookahead
只需要这个正则就可以:
r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,12}$"
其中第一个(?=.[a-z]),意思是字符串里面必须有.[a-z],但是不用管顺序,也不会捕获他。
来自网页的解释:https://www.sitepoint.com/demystifying-regex-with-practical-examples/
这样做的坏处,是不能给出每个不匹配的错误信息。
参考资料:
- 匹配密码,等几个有用的正则的解释:https://www.sitepoint.com/demystifying-regex-with-practical-examples/
- Positive and Negative Lookahead的官网解释:http://www.regular-expressions.info/lookaround.html
- What does ?= mean in a regular expression? https://stackoverflow.com/questions/1570896/what-does-mean-in-a-regular-expression
4、正则表达式语法 https://www.runoob.com/regexp/regexp-syntax.html