快刀斩乱麻,regexp filter高效筛选不合格密码用户
为了实现一个正则表达式(regexp)过滤器来筛选不合格的密码,我们首先需要定义什么是不合格的密码。以下是一些常见的密码不合格条件:
1. 密码长度不足。
2. 密码中不包含大写字母。
3. 密码中不包含小写字母。
4. 密码中不包含数字。
5. 密码中不包含特殊字符。
以下是一个Python代码示例,它使用正则表达式来检查密码是否符合上述条件,并筛选出不符合条件的用户:
```python
import re
# 定义一个函数来检查密码是否合格
def is_password_valid(password):
# 正则表达式,检查密码是否包含至少一个小写字母、一个大写字母、一个数字和一个特殊字符
# 并且密码长度至少为8个字符
pattern = re.compile(r'^(?=.[a-z])(?=.[A-Z])(?=.d)(?=.[@$!%?&])[A-Za-zd@$!%?&]{8,}$')
return pattern.match(password) is not None
# 假设有一个用户列表和他们的密码
users = [
{'username': 'user1', 'password': 'Password1'},
{'username': 'user2', 'password': 'pass'},
{'username': 'user3', 'password': 'PASSWORD123'},
{'username': 'user4', 'password': 'Password!'},
相关内容:
网友求助SOS:如何将密码中至少4个连续相同数字的用户筛选出来?A1:B7区域为数据源。A列为用户名,B列为密码。要求在D列筛选出不合格密码的用户,出现至少连续4个一样数字的为不合格的密码。例如密码“71170000”中有4个连续的0,所以为不合格密码,它所对应的用户名为“C”。

我们使用两大函数利器:REGEXP函数与FILTER函数,双剑合璧,快刀斩乱麻,快速解决问题。
第一步:判断数字是否至少4个连续重复
使用REGEXP正则表达式函数:
=REGEXP(B2:B7,".").:匹配任意单个字符。
我们想象的应该是会返回B2:B7区域每个单元格全部可能的任意单个字符。
例如:
B2="81222283" 返回 {"8","1","2","2","2","2","8","3"}
B3="11121314" 返回 {"1","1","1","2","1","3","1","4"}
但实际上:
REGEXP函数对B2:B7区域中每个单元格独立处理,但仅返回每个单元格的第一个匹配结果,其余的会视觉省略掉。也就是说REGEXP第一参数若是对区域进行处理,默认采用 “单匹配优先” 逻辑,避免多维数组混乱。例如 B2="81222283" 返回 "8",B3="11121314" 返回 "1"
此特点是 Excel/WPS 的函数设计特性,与正则表达式语法无关。其实作用一样,只是视觉输出不同。

继续完善正则表达式:
=REGEXP(B2:B7,"(.)")( ):捕获组,将匹配的字符保存起来,以便后续引用。

继续完善正则表达式:
=REGEXP(B2:B7,"(.)1{3}")1:反向引用,表示引用第一个捕获组,即 (.) 匹配到的字符。
作用:确保下一个字符与第一个字符相同。例如,如果第一个字符是"2",则1要求下一个字符也是"2"。
{3}:量词,表示前面的元素,即1 必须连续出现3次。
作用:结合1,表示“相同的字符再重复3次”。所以1{3}等同于“相同字符连续出现3次”。
(.)1{3} 组合效果:
匹配一个字符后跟着相同字符连续3次,总连续4个相同字符。
例如:
匹配"2222"(4个2)、"0000"(4个0)等。
在密码"81222283"中,它会匹配到"2222"部分。

继续完善公式:
=REGEXP(B2:B7,"(.)1{3}",1)REGEXP函数省略第3参数默认的是“提取”模式,将第3参数修改为“1”,REGEXP函数由默认的“提取”模式转换为了“判断”模式。
即密码有连续4位相同时,返回逻辑值TRUE,否则返回逻辑值FALSE。

第二步:筛选符合条件的用户
运用FILTER筛选函数:
=FILTER(A2:A7,REGEXP(B2:B7,"(.)1{3}",1))Excel的FILTER函数,用于根据条件筛选数据。
生成FILTER函数所需的“筛选条件”数组:
如果密码不合格(如"81222283"中的"2222"),对应位置为TRUE,FILTER会保留该用户名。
如果密码合格(如"11121314"只有连续3个"1"),对应位置为FALSE,FILTER会忽略该用户名。
