Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-执行sqlite查询后的正则表达式模式匹配问题_Python_Mysql_Sql_Regex_Sqlite - Fatal编程技术网

Python-执行sqlite查询后的正则表达式模式匹配问题

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

我试图从一个表中提取一些信息,并使用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.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]+)\.+$