Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中使用lookahead RegEx进行密码检测_Python_Regex_Regex Lookarounds - Fatal编程技术网

Python中使用lookahead RegEx进行密码检测

Python中使用lookahead RegEx进行密码检测,python,regex,regex-lookarounds,Python,Regex,Regex Lookarounds,我正在编写一个函数来检查密码是否符合要求。这些要求是: 至少8个字符 至少1个大写字母 至少1个小写字母 至少1个 这些特殊字符中至少有一个:@$!#%*& 这是我的密码: passwordCriteria = re.compile(r''' (?=.*[a-z]) (?=.*[A-Z]) (?=.*\d) (?=.*[@$!%*#?&]) [A-Za-z\d@$!#%*?&]{8,}$ ''

我正在编写一个函数来检查密码是否符合要求。这些要求是:

  • 至少8个字符
  • 至少1个大写字母
  • 至少1个小写字母
  • 至少1个
  • 这些特殊字符中至少有一个:@$!#%*& 这是我的密码:

    passwordCriteria = re.compile(r'''
            (?=.*[a-z])
            (?=.*[A-Z])
            (?=.*\d)
            (?=.*[@$!%*#?&])
            [A-Za-z\d@$!#%*?&]{8,}$
        ''', re.VERBOSE)
    
    如果我输入密码:Newyork@1995. 密码应符合要求

    但是,当我从上述代码中删除此条件时,
    (?=.*\d)
    。密码显然仍然符合要求

    这怎么可能?此前瞻检查是否确保密码中至少有一个数字?

    您的正则表达式接受
    Newyork@1995
    因为您的字符类
    [A-Za-z\d@$!#%*?&]
    包含
    \d
    ,但是如果没有前瞻性断言,则不会强制要求必须存在数字。但还有另一个问题

    在保证您的密码满足除4个前瞻断言中的8个字符长度之外的所有要求后,您真正需要匹配的是确保输入长度至少为8个字符,其中:
    {8,}

    import re
    
    passwordCriteria = re.compile(r'''
            (?=.*[a-z])
            (?=.*[A-Z])
            (?=.*\d)
            (?=.*[@$!%*#?&])
            .{8,}$
        ''', re.VERBOSE)
    
    m = passwordCriteria.match('aA$7xxxxxxxxx')
    print(m)
    m = passwordCriteria.match('aA$xxxxxxxxx')
    print(m)
    
    印刷品:

    <_sre.SRE_Match object; span=(0, 13), match='aA$7xxxxxxxxx'>
    None
    
    
    没有一个
    

    像您这样使用这个字符类规范和前瞻断言是完全多余的,并且可能导致潜在的维护问题。此外,除了“必需”字符外,用户可能还可以输入其他字符,例如连字符,但您的正则表达式不允许这样做。

    是的,它允许。但是你的论证逻辑是错误的;仅仅因为您不再使用lookahead并不意味着整数不应该匹配。例如,长度检查部分也有整数匹配。