密码正则表达式调整:仅拒绝包含恰好4位数字的密码
解决方案
要实现你的需求,只需修改正则中禁止连续数字的负向前瞻部分,将原来禁止所有4位及以上连续数字的规则,改为仅禁止恰好连续4位数字的情况。
修改后的正则表达式:
pattern = r"^(?=.*[A-Z]{2,})(?=.*[0-9])(?!.*(?<!\d)\d{4}(?!\d))(?!.*[\s]).*$"
规则拆解
(?=.*[A-Z]{2,}):确保密码包含至少2个连续大写字母,原规则保留。(?=.*[0-9]):确保密码包含数字,原规则保留。(?!.*(?<!\d)\d{4}(?!\d)):核心修改部分,意思是禁止出现前后非数字(或字符串首尾)的连续4位数字:(?<!\d):断言当前位置前不是数字(确保这4位数字的开头前没有其他数字)\d{4}:匹配4位数字(?!\d):断言当前位置后不是数字(确保这4位数字的结尾后没有其他数字)
这样一来,连续3位及以下、连续5位及以上的数字都会被允许,只有恰好连续4位的数字会被拒绝。
(?!.*[\s]):确保密码不包含空格,原规则保留。
测试代码
import re s1 = 'annII#443' s2 = 'annII#4343' s3 = 'annII#43434' pattern = r"^(?=.*[A-Z]{2,})(?=.*[0-9])(?!.*(?<!\d)\d{4}(?!\d))(?!.*[\s]).*$" print(re.findall(pattern, s1)) # ['annII#443'] print(re.findall(pattern, s2)) # [] print(re.findall(pattern, s3)) # ['annII#43434']
测试结果符合预期:s1(3位连续数字)和s3(5位连续数字)通过匹配,s2(恰好4位连续数字)被拒绝。
内容的提问来源于stack exchange,提问作者sash a
相关产品推荐
相关产品推荐

