正则表达式-从一个‘至少存在两种数值类型的密码‘的例子探究零宽断言

今天被同事问了一个关于正则表达式的问题,于是查阅了一些资料,感觉对正则表达式有了更深入的理解。在这里做个笔记。

问题:

对于输入的密码,需要验证它是否由数字、字母和特殊符号中的至少两种组成。
要求:

  • 数字为’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}进行匹配,可以保证满足要求。

在这里插入图片描述

参考资料:

python中re模块中的向后引用以及零宽断言
正则基础之——NFA引擎匹配原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值