我不知道如何修改我的正则表达式以确保密码遵循最后一个条件:
- 至少连续2个大写字母
- 没有空格符号
- 包含数字
- 不包含4个连续数字
{4}它目前不批准的密码,如果它有4个和更多的数字,但我需要它不批准的密码正好4个数字。
s1 = 'annII#443'
s2 = 'annII#4343'
s3 = 'annII#43434'
pattern = r"^(?=.*[A-Z]{2,})(?=.*[A-Za-z])(?=.*[0-9])(?!.*[0-9]{4})(?!.*[\s]).*$"
re.findall(pattern, s1) # ['aШnnII#443']
re.findall(pattern, s2) # []
re.findall(pattern, s3) # []
PS:这只是一个任务,所以不要担心。它不会被用于任何真实的的目的。
1条答案
按热度按时间3pmvbmvn1#
1.要精确匹配四位数字,可以使用at start
^
,例如(?!(?:.*\D)?\d{4}(?!\d))
。这要求在4位数字之前有 start 或
\D
非数字,而在4位数字之后不允许有数字。1.如果您已经需要
(?=.*[A-Z]{2,})
(上面的2个),(?=.*[A-Za-z])
看起来是多余的。{2,}
两个 * 或更多 * 是冗余的。{2}
就足够了,并且不会改变逻辑。1.除了
(?!.*[\s]).*$
,您可以只使用\S*$
(高位匹配 * 非空格 *)。1.通常,使用lazy
.*?
或者甚至在可能的情况下使用否定类会更有效。See this demo at regex101(在多行演示中为求反添加了
\n
以保持一致)