我的导师和我需要一个正则表达式的密码,要求密码至少包含1个大写字母和至少1个数字。通过文档浏览,甚至在这里我们发现如果前面,后面或中间有一个大写字母,它将匹配,但是当整个密码为大写时它会失败。我们使用的正则表达式是(?=.*[a-z])(?=.*[A-Z]).+
。我们真的可以在这个问题上使用一些帮助。环境是Python3,Flask和Jinja2。
答案 0 :(得分:1)
这将完成这项工作:
^(?=.*[A-Z])(?=.*\d).+$
...说明
^ start of string
(?=.*[A-Z]) at least one upper case letter exists
(?=.*\d) at least one digit exists
.+ match all other characters
$ end of string
...加上一个简短的例子:
bool(re.match("^(?=.*[A-Z])(?=.*\d).+$", "Password1")) # true
bool(re.match("^(?=.*[A-Z])(?=.*\d).+$", "password1")) # false
bool(re.match("^(?=.*[A-Z])(?=.*\d).+$", "Password")) # false
答案 1 :(得分:1)
你似乎不喜欢有积极前瞻的解决方案,如何:
import re
def CapitalAndNumberInText(text):
def matches(pattern):
return bool(re.match(pattern,text))
return matches(r".*[A-Z].*") and matches(r".*[0-9].*")
print( CapitalAndNumberInText("Not here"))
print( CapitalAndNumberInText("not here"))
print( CapitalAndNumberInText("not 2 here"))
print( CapitalAndNumberInText("But 2 here"))
输出:
False
False
False
True
如果你的导师无法解决这个谜题,至少现在你可以提供一个解决方案......虽然one regex with lookaheads更优雅。