我正在尝试返回用户输入的密码,如果它匹配a-z
, A-Z
, 0-9
, _
,-
否则将在 try 子句中执行 ValueError 。这是我的代码行,它似乎不起作用,因为它几乎允许 (?.,@#$%^*)
return re.match('^[A-Za-z0-9_-]*$',password)
使用 Kleene 闭包,您可以使用空字符串作为正确的密码。您可以使用+
特殊字符匹配一个重复的有效字符:
def validate(password):
match = re.match('^[a-z0-9_-]+$', password, re.I)
if match is not None:
return password
else:
raise ValueError
使用集合和集合减法可能是一个更简单的解决方案。
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!!!
这是使用的非正则表达式解决方案isalnum
:
for c in password:
if not (c.isalnum() or c in ['_', '-']):
raise ValueError('Invalid character in password')