You need to enable JavaScript to run this app. Python结合SQLite、正则及pandas校验密码时正则匹配失效问题排查
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 13:36:01