【发布时间】:2011-02-28 18:12:23
【问题描述】:
在 Python 中使用正则表达式,我如何验证用户的密码是:
- 至少 8 个字符
- 必须限于,但不具体要求:
- 大写字母:A-Z
- 小写字母:a-z
- 数字:0-9
- 任何特殊字符:@#$%^&+=
注意,所有字母/数字/特殊字符都是可选的。我只想验证密码长度是否至少为 8 个字符,并且仅限于字母/数字/特殊字符。如果他们愿意,用户可以选择更强/更弱的密码。 到目前为止,我所拥有的是:
import re
pattern = "^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$"
password = raw_input("Enter string to test: ")
result = re.findall(pattern, password)
if (result):
print "Valid password"
else:
print "Password not valid"
【问题讨论】:
-
我建议不要在这个测试中使用正则表达式。这样维护起来要容易得多。
-
其实,这个正则表达式一点也不复杂,而且很有意义。
-
Amber 的回答是正确的,但是虽然允许
aaaaaaaa的密码验证器可能是“已验证”,但“如果他们愿意”允许这样的弱密码并不比接受 @ 的验证器好多少987654323@。值得注意的是,用户最喜欢的密码之一是password;如果您允许这样做,您不妨完全跳过密码。 -
@Amber,不使用正则表达式的重点不是因为正则表达式不好,而是因为维护正则表达式并不容易,而且密码要求是经常变化的东西。正如您的答案所示,他的示例对于正则表达式来说是“简单的”。但是一旦有人说这 4 个字符集中必须至少有 3 个:至少 1 个大写,至少 1 个小写,至少 1 个数字和至少 1 个特殊字符,复杂度就会上升。
-
@jmucchiello - 维护正则表达式只有在您采用必须在单个正则表达式中完成的方法时才复杂,无论它有多复杂。 “智能”方法是使用正则表达式(因为它们是进行许多测试的有效方法),但不要试图将太多内容集中到同一个正则表达式中。例如,在您的示例中,那些“至少 1 个”测试可以在 additional 代码中完成,它们不必添加到同一个正则表达式中。