Python 3中密码的正则表达式

时间:2016-06-13 16:36:18

标签: python regex

我想验证用户的密码是否为:

  1. 由8个字符组成
  2. 由数字和字母组成
  3. 至少一个大字和一个数字
  4. 它应该包含$或!还是?
  5. 订单无关紧要
  6. 我的代码是:

    r.match(r'([A-Z]+)([a-z])([0-9]+)($|?|!){8}',password)
    

    这是正确答案吗?我不知道如何指定,该顺序在正则表达式中无关紧要。

    EDITED 使用一些建议我编辑了我的代码:

    m = re.compile(r'^(?=.*\d)(?=.*[A-Z])(?=.*[\$|\?\!])[A-Za-z\d$!&]{8}$')
    m.match('adwA12f!')
    <_sre.SRE_Match object; span=(0, 8), match='adwA12f!'>
    

    如果有可能澄清,你能取悦,究竟是什么“?=。”正则表达式意味着。

3 个答案:

答案 0 :(得分:2)

这似乎在IDLE 2.7.9中进行了测试。请记住,这只匹配8个字符

^(?=.*[!$?])(?=.*[a-z])(?=.*[A-Z]).{8}$

import re
p = re.compile('^(?=.*[!$?])(?=.*[a-z])(?=.*[A-Z]).{8}$')
test_str = 'a2Cd$F!8'
if re.search(p, test_str):
    print('string matched')

输出:

string matched

?=是一个先行断言;建议您阅读本网站:"Lookahead Assertion"

.匹配除换行符之外的任何字符;由于您有方括号,.仅限于[]中定义的内容;也称为原子分组。

答案 1 :(得分:0)

我想明显的非正则表达方式是:

symbols = '$!?'
if (len(pwd) >= 8 and
        any(c.isdigit() for c in pwd) and
        any(c.isupper() for c in pwd) and
        any(c in symbols for c in pwd) and
        all(c.isalnum() or c in symbols for c in pwd)):
    print('good password')
else:
    print('bad password')

你没有说,但我认为你也至少要一个小写。如果是这样,也添加这个子句

any(c.islower() for c in pwd)

答案 2 :(得分:0)

至少在我的系统上,不使用re进行检查的速度要快一些。此外,随着密码长度的增加,速度差异似乎变得更加明显。

import re
import timeit

passwords_varied = ("kk", "999999999999999999999999", "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", "gkrDsh!2", "gjtlssssssssssssssssfsdg43ggw3fa2adada2fagaa2adajjjjjjjjjjjjjjjkhjkhjkhjkd45!", "kit43MM?", "fkthrej!", "483kkED!")

passwords_8chars = ("hktj33cD", "!?gk329s", "fkrK44?a", "dlekAS2$", "??ffD913")

def check1(s):
    return len(s) == 8 and \
    any(x.isdigit() for x in s) and \
    any(x in ("$","!","?") for x in s) and \
    any(x.isupper() for x in s)

def check2(s):
    if len(s) == 8 and \
    re.search(r"\d", s) and  \
    re.search(r"[$!?]", s) and \
    re.search(r"[A-Z]", s):
        return True
    return False

def run1(passwords):
    for password in passwords:
        check1(password) 

def run2(passwords):
    for password in passwords:
        check2(password)


def main():
    print ("---- list comprehension approach ----")
    print ("varying length passwords")
    print(timeit.timeit("run1(passwords_varied)", setup="from __main__ import run1, passwords_varied", number=100000))
    print ("correct length passwords")
    print(timeit.timeit("run1(passwords_8chars)", setup="from __main__ import run1, passwords_8chars", number=100000))
    print ""
    print "---- 're' approach ----"
    print ("varying length passwords")
    print(timeit.timeit("run2(passwords_varied)", setup="from __main__ import run2, passwords_varied", number=100000))
    print "correct length passwords"
    print(timeit.timeit("run2(passwords_8chars)", setup="from __main__ import run2, passwords_8chars", number=100000))


if __name__ == '__main__':
    main()


"""
---- list comprehension approach ----
varying length passwords
2.69666814804
correct length passwords
3.31486010551

---- 're' approach ----
varying length passwords
3.27806806564
correct length passwords
4.286420106

"""
相关问题