Python Regex实现字符串校验:需至少12位且含字母、数字、非字母数字字符
问题原因
你当前编写的正则存在两个核心逻辑错误,导致匹配不符合预期:
- 强制要求字符必须按照「连续字母→连续数字→连续特殊字符」的固定顺序排列,只要字符出现顺序不符合该规则就会校验失败
- 量词
{12,}修饰的是前面的[A-Za-z]+[0-9]+\W+分组,要求这个三元分组至少重复12次,而非校验整个字符串的总长度≥12
修正方案
使用零宽正向预查实现多条件并行校验,不需要限制字符的出现顺序,正则逻辑如下:
(?=.*[A-Za-z])校验字符串中至少包含1个英文字母(?=.*\d)校验字符串中至少包含1个数字(?=.*\W)校验字符串中至少包含1个非字母数字字符.{12,}校验字符串总长度不少于12个字符
修正后的完整代码:
import re regex = re.compile(r'^(?=.*[A-Za-z])(?=.*\d)(?=.*\W).{12,}$') def is_valid(string): return re.fullmatch(regex, string) is not None test_string = "abdfjhfl58425!!" print(is_valid(test_string)) # 输出结果为 True
补充说明
如果你的校验规则中,下划线_也属于需要匹配的非字母数字字符,将正则中的\W替换为[^a-zA-Z0-9]即可,因为Python正则中原生\W默认不包含下划线。
内容的提问来源于stack exchange,提问作者bendour
相关产品推荐
相关产品推荐

