Python3使用re.match检查密码是否包含某些字符

时间:2013-04-09 23:08:19

标签: python regex match

我试图返回用户输入的密码,如果它与a-zA-Z0-9_-匹配,否则会出现ValueError在try子句中执行。这是我的代码行似乎不起作用,因为它允许任何类似的东西(?。,@#$%^ *)

return re.match('^[A-Za-z0-9_-]*$',password)

3 个答案:

答案 0 :(得分:2)

使用Kleene闭包,您允许空字符串作为正确的密码。您可以使用+特殊字符匹配有效字符的一个重复:

def validate(password):
    match = re.match('^[a-z0-9_-]+$', password, re.I)
    if match is not None:
        return password
    else:
        raise ValueError

答案 1 :(得分:1)

概要

使用集合和集合减法可能是一种更简单的解决方案。

代码

from string import ascii_letters, digits

PASSWORD_SET = set(ascii_letters + digits + "_-")

def has_only_password_letters(candidate):
    return not(set(candidate) - PASSWORD_SET)

或:

def has_only_password_letters(candidate):
    return all(c in PASSWORD_SET for c in candidate)

测试

>>> def test_password(password):
...     if has_only_password_letters(password):
...         print "Okay: ", password
...     else:
...         print "Nuh-uh: ", password
... 
>>> test_password("asdasd123123")
Okay:  asdasd123123
>>> test_password("asdasd123123!!!")
Nuh-uh:  asdasd123123!!!

答案 2 :(得分:0)

以下是使用isalnum的非正则表达式解决方案:

for c in password:
    if not (c.isalnum() or c in ['_', '-']):
        raise ValueError('Invalid character in password')