Python使用 positive lookahead 实现用户密码的校验

如果要校验用户密码,有两种写法。

写法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/

这样做的坏处,是不能给出每个不匹配的错误信息。

参考资料:

  1. 匹配密码,等几个有用的正则的解释:https://www.sitepoint.com/demystifying-regex-with-practical-examples/
  2. Positive and Negative Lookahead的官网解释:http://www.regular-expressions.info/lookaround.html
  3. 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