Python结合SQLite、正则及pandas校验密码时正则匹配失效问题排查
问题根源
- 正则表达式书写错误
原代码中使用的正则字符串r"(r'^(?=.*[0-9])(?=.*\W).*$')",误将Python raw string的语法标记r'、'作为字面匹配内容嵌入正则规则,实际匹配逻辑变为寻找带特定引号前缀后缀的字符串,完全失去密码校验作用。由于所有数据库内的密码都不可能命中这个字面规则,自然会出现“判断取反就全量收录、正向判断就返回空列表”的异常现象。 - 循环逻辑错误
passwordCheck函数中写的for match in row[5],是遍历密码字段的每一个单个字符,而非遍历正则匹配结果,每遍历一个字符就追加一次用户ID,最终会无差别把所有用户ID塞入结果列表。 - 校验逻辑方向偏移
当前正则规则的作用是匹配同时包含数字、特殊字符的合规密码,目标是收集不满足该规则的不合规密码,原代码完全没有对正则匹配结果做有效布尔判断,validPass函数中甚至写了恒成立的if True判断,直接跳过了所有过滤流程。 - 冗余pandas逻辑失效
validPass函数中对单条密码生成的筛选Series没有做结果存储、没有基于筛选结果做判断,相当于没有执行任何过滤操作。
修正后代码
import re import sqlite3 def getNonCompliantUserId(filename): non_compliant_id = [] con = sqlite3.connect(filename) cur = con.cursor() # 合规密码校验规则:根据实际复杂度要求可灵活扩展前瞻校验项 # 当前规则匹配同时包含数字、特殊字符的合规密码 valid_pattern = r"^(?=.*[0-9])(?=.*\W).*$" # 若要求同时校验大小写字母,可将规则替换为: # valid_pattern = r"^(?=.*[0-9])(?=.*\W)(?=.*[a-z])(?=.*[A-Z]).*$" for user_id, password in cur.execute("SELECT user_id, password FROM data;"): password = str(password) # 匹配结果为空 = 不满足合规要求,加入结果列表 if not re.match(valid_pattern, password): non_compliant_id.append(user_id) con.close() return non_compliant_id
修正要点
- 移除正则字符串里冗余的
r'、'字面内容,让正则校验规则真正生效 - 不再遍历密码的单个字符,直接基于正则匹配结果做判断,仅当密码不满足合规规则时才追加用户ID
- 用明确的字段名替代
SELECT *查询,避免表结构调整导致取错字段值的问题 - 补充数据库连接关闭逻辑,避免资源泄漏
- 可根据实际密码复杂度要求,在正则的前瞻校验部分补充对应规则,无需调整整体逻辑
内容的提问来源于stack exchange,提问作者TML
相关产品推荐
相关产品推荐

