我试图返回用户输入的密码,如果它与a-z
,A-Z
,0-9
,_
,-
匹配,否则会出现ValueError在try子句中执行。这是我的代码行似乎不起作用,因为它允许任何类似的东西(?。,@#$%^ *)
return re.match('^[A-Za-z0-9_-]*$',password)
答案 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')