今天被同事问了一个关于正则表达式的问题,于是查阅了一些资料,感觉对正则表达式有了更深入的理解。在这里做个笔记。
问题:
对于输入的密码,需要验证它是否由数字、字母和特殊符号中的至少两种组成。
要求:
- 数字为’0-9’,字母为’a-zA-Z’,特殊符号为’!@#$%^&*._?'。
- 密码长度要求在6-32之间。
解答:
import re
password = 'abc123'
pattern = '^(?![\d]+$)(?![a-zA-Z]+$)(?![!@#$%^&*._?]+$)[\da-zA-Z!@#$%^&*._?]{6, 32}'
re.match(pattern, password)
参考资料:
密码正则表达式:精准校验:必须含有数字、字母、特殊字符,三个缺一不可
解析
要求必须必须由数字、字母和特殊符号组成,且长度必须是6-32,所以主体是[\da-zA-Z!@#$%^&*._?]{6, 32}
;
要求包含数字、字母和特殊符号中的至少两种,则说明纯数字、纯字母、纯特殊符号这三种情况都必须排除,考虑使用零宽负向先行断言来处理,首先利用^
匹配字符串开头,然后(?![\d]+$)
表示后面不能是纯数字,(?![a-zA-Z]+$)
表示后面不能是纯字母,(?![!@#$%^&*._?]+$)
表示后面不能是纯特殊符号,由于是零宽的,所以断言通过后,仍处在字符串开头位置,此时根据[\da-zA-Z!@#$%^&*._?]{6, 32}
进行匹配,可以保证满足要求。