【问题标题】:SQL data that does not match Regex isnt filtered out与 Regex 不匹配的 SQL 数据不会被过滤掉
【发布时间】:2026-02-21 11:10:01
【问题描述】:

我一直在尝试设置一个正则表达式参数,该参数查看 SQL 文件中的密码字符串并将记录的 ID 移动到列表中。当设为 True 时,所有条目都会添加到列表中,但一个不正确的密码仍会添加到列表中,即使它不应该传递正则表达式参数。


def passwordCheck(filename):
  idList = []
  con = sqlite3.connect(filename)
  cur = con.cursor()
  for row in cur.execute("SELECT * FROM data;"):
    row[5] = str(row[5])
    regScan = re.match(r"(r'^(?=.*[0-9])(?=.*\W).*$')", row[5])
    for match in row[5]:
      idList.append(row[0])
  return idList

def validPass(filename):
  idList = []
  con = sqlite3.connect(filename)
  cur = con.cursor()
  for row in cur.execute("SELECT * FROM data;"):
    string = pd.Series(row[5])
    string[string.str.match(r"(r'^(?=.*[0-9])(?=.*\W).*$')")==True]
    if True:
      idList.append(row[0])
  return idList

这里我有两种方法,一种是单独使用正则表达式和 SQL 文件,另一种是尝试使用 pandas 来达到同样的目的。

我的数据库中的一个密码只是“密码”,而其他密码有 1 个小写字母、大写数字和特殊字符。我的目标是标记不正确的密码,并将其相应的用户 ID 放在列表中。所以我的输出应该是这样的:

[7]

然而,当我将参数设置为 False 时,它​​总是空白,或者当我设置为 True 时,所有条目都被添加,尽管 ID: 7 是唯一应该标记的不正确条目。

任何帮助将不胜感激。

【问题讨论】:

  • 这一行:if True: 表示您的代码将始终执行此if 语句中的内容。相反,您想检查正则表达式的结果是否为 True。
  • 我明白你的意思,那么我应该用什么来检查结果是真还是假?
  • 试试这个:if not string.str.match('^(?=.*[0-9]$)(?=.*[a-zA-Z])'):。我调整了正则表达式,因为您的正则表达式没有按我预期的方式工作,但如果它适合您,请随时继续使用您的。

标签: python sql regex passwords


【解决方案1】:

1 . regScan = re.match(r"(r'^(?=.*[0-9])(?=.*\W).*$')", row[5])

  1. string[string.str.match(r"(r'^(?=.*[0-9])(?=.*\W).*$')")==True]

都错了。

不要将原始字符串文字放在原始字符串文字中。而不是 1) 使用

regScan = re.match(r'(?=.*[0-9]).*\W', row[5])

而不是 2) 使用

if not string.str.match(r'(?=.*[0-9]).*\W'):
    idList.append(row[0])

您不需要^ 锚点,match 在字符串开头搜索匹配项。

快速正则表达式参考:

  1. (?=.*[0-9]) 要求字符串中有数字
  2. \W 搜索既不是字母、数字也不是下划线的字符(您的意思是使用\w?)

【讨论】:

  • 我已经尝试了两种编辑方法,但都出现了“不平衡括号”错误。我已经解决了这两个问题,因为这是您的括号问题,但现在我没有得到任何 7 个结果。如果您愿意,我可以进一步解释我要做什么,这对您来说很清楚,因为我似乎只是走入了死胡同。
  • @TML 抱歉,已解决问题。但是,如果您提供必须通过的字符串和必须通过检查的字符串,我只能提供更多帮助。