Python-执行sqlite查询后的正则表达式模式匹配问题
我试图从一个表中提取一些信息,并使用Sqlite和Python将其存储在另一个表中。表1以(www.abc.com)的形式列出了网站列表。我试图从每一行提取(abc)部分,并将其存储在表2中,表2中还保存了每个站点的计数。如果站点已经存在于表2中,那么它只是增加计数 下面是我的代码:Python-执行sqlite查询后的正则表达式模式匹配问题,python,mysql,sql,regex,sqlite,Python,Mysql,Sql,Regex,Sqlite,我试图从一个表中提取一些信息,并使用Sqlite和Python将其存储在另一个表中。表1以(www.abc.com)的形式列出了网站列表。我试图从每一行提取(abc)部分,并将其存储在表2中,表2中还保存了每个站点的计数。如果站点已经存在于表2中,那么它只是增加计数 下面是我的代码: p = re.compile('^.+\.([a-zA-Z]+)\..+$') for row in c.execute('SELECT links FROM table1'): link = p.matc
p = re.compile('^.+\.([a-zA-Z]+)\..+$')
for row in c.execute('SELECT links FROM table1'):
link = p.match(row[0])
if link.group(1):
print(link.group(1))
c.execute('SELECT EXISTS(SELECT 1 FROM table2 WHERE site_name = ?)', (link.group(1), ))
当我运行脚本时,它只执行一次,然后我得到:
Traceback (most recent call last):
File "test.py", line 43, in <module>
link = p.match(row[0])
TypeError: expected string or buffer
回溯(最近一次呼叫最后一次):
文件“test.py”,第43行,在
link=p.match(第[0]行)
TypeError:应为字符串或缓冲区
如果我注释掉c.execute行,所有站点名称都会正确打印出来。我不熟悉Python和Sqlite,所以我不确定问题出在哪里
任何帮助都会很好,提前谢谢 问题在于,您在一个游标上迭代,该游标的行包含一个字符串:
for row in c.execute('SELECT links FROM table1'):
…但是,在迭代的中间,你把它变成一个游标,它的行由一个单一的数字组成:
c.execute('SELECT EXISTS(SELECT 1 FROM table2 WHERE site_name = ?)', (link.group(1), ))
因此,当您得到下一行时,它将是[1]
,而不是[]http://example.com“]
,因此p.match(行[0])
正在将编号1
传递给match
,它抱怨1
不是字符串或缓冲区
作为将来的参考,通过查看中间值来调试东西确实很有帮助。无论您是在调试器中运行,还是仅仅添加
print(row)
调用等来记录正在发生的事情,您都会知道它第一次在循环中工作,但第二次失败,失败时row
看起来像[1]
。这会让你更容易找到问题(或者让你问一个更好的问题,因为很明显你仍然无法自己找到所有问题)
你可以(至少)用三种方式来解决这个问题,按照“适当的话善行”的递增顺序:
- 从第一个查询中获取所有值,然后循环这些值,这样第二个查询就不会碍事
- 对每个查询使用单独的游标,而不是重复使用同一个游标
- 首先不要进行第二个查询,这是一个
查询,并且您没有对行执行任何操作,那么它有什么好处呢SELECT
c.execute
行?你正在迭代一个游标,然后你告诉游标在你正在迭代的中间做一个不同的查询。你想在那里发生什么?我不知道SQLite的东西,但是你的正则表达式至少需要3个部分和2个句点。如果它是^(?:.+\)?([a-zA-Z]+)\.+$