regex 如果密码正好包含4位数字,则不批准密码(验证)

hxzsmxv2  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(115)

我不知道如何修改我的正则表达式以确保密码遵循最后一个条件:

  • 至少连续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:这只是一个任务,所以不要担心。它不会被用于任何真实的的目的。

3pmvbmvn

3pmvbmvn1#

1.要精确匹配四位数字,可以使用at start^,例如(?!(?:.*\D)?\d{4}(?!\d))
这要求在4位数字之前有 start\D非数字,而在4位数字之后不允许有数字。
1.如果您已经需要(?=.*[A-Z]{2,})(上面的2个),(?=.*[A-Za-z])看起来是多余的。

  1. {2,}两个 * 或更多 * 是冗余的。{2}就足够了,并且不会改变逻辑。
    1.除了(?!.*[\s]).*$,您可以只使用\S*$(高位匹配 * 非空格 *)。
    1.通常,使用lazy .*?或者甚至在可能的情况下使用否定类会更有效。
^(?=[^A-Z]*[A-Z]{2})(?=\D*\d)(?!(?:.*\D)?\d{4}(?!\d))\S*$

See this demo at regex101(在多行演示中为求反添加了\n以保持一致)

相关问题