正则表达式python和sqlite的问题

时间:2011-03-19 22:48:09

标签: python regex sqlite

我尝试在sqlite数据库上使用带有python的正则表达式检查带有模式的字符串。 当我尝试使用“patern using”搜索字符串时,我遇到了问题 例如:

cur.execute("insert into articles(id,subject) values (1,'aaa\"test\"')")
cur.execute("select id,subject from articles where id = 1")
print (cur.fetchall())

cur.execute("select subject from articles where  subject regexp '\"test\"' ")
print (cur.fetchall())

我应该\“之前regexp其他方式编译器不喜欢...语法错误

[(1, 'aaa"test"')]
[] <????? should found 

有人知道怎么做吗?

我的正则表达式函数:con.create_function(“regexp”,2,regexp)

3 个答案:

答案 0 :(得分:24)

使用参数化的sql。然后你不需要自己逃避引号:

import sqlite3
import re

def regexp(expr, item):
    reg = re.compile(expr)
    return reg.search(item) is not None

conn = sqlite3.connect(':memory:')
conn.create_function("REGEXP", 2, regexp)
cursor = conn.cursor()
cursor.execute('CREATE TABLE foo (bar TEXT)')
cursor.executemany('INSERT INTO foo (bar) VALUES (?)',[('aaa"test"',),('blah',)])
cursor.execute('SELECT bar FROM foo WHERE bar REGEXP ?',['"test"'])
data=cursor.fetchall()
print(data)

产量

[(u'aaa"test"',)]

答案 1 :(得分:1)

您可以使用三重转义或原始字符串。

你在做:

>>> print("select subject from articles where  subject regexp '\"test\"' ")
select subject from articles where  subject regexp '"test"'

使用原始字符串,即r'string with a r in front'

>>> print(r"select subject from articles where  subject regexp '\"test\"' ")
select subject from articles where  subject regexp '\"test\"' 

或三重逃脱(\\\):

>>> print("select subject from articles where  subject regexp '\\\"test\\\"' ")
select subject from articles where  subject regexp '\"test\"'

答案 2 :(得分:0)

另一个参数化查询示例...

对于必须向数据库提供自己的REGEX函数的情况-我猜Python sqlite3并不总是默认设置它。

在另一个示例中,自定义REGEX函数正在为每个匹配项编译相同的表达式。有一种解决方法。下面的示例在另一种定义REGEX操作的方法的底部也有一个注释。

通过为每个查询创建自定义函数并仅一次编译表达式,您就可以遍历每次处理大量数据的查询时使用表达式(针对每个匹配项)。 。在self._conn下面是数据库连接,而curs是它的游标。

    # Form an expression to match nicknames with the last 3 characters
    # varying.
    nick_expr = re.sub(r"[0-9_\-|]{0,3}$", r"[0-9_\-|]{0,3}$", nick)
    nick_expr = re.compile(nick_expr, re.I)

    # Create custom sqlite3 function using the compiled expression.
    self._conn.create_function("NICKEXPR",
                               1,
                               lambda nick: nick_expr.match(nick) != None)

    # Create temporary table from first pass query.
    curs.execute(
        """ CREATE TEMP TABLE temp_table1 AS
           SELECT  DISTINCT *
           FROM    users
           WHERE   NICKEXPR(nick)
               OR  host LIKE ?
               OR  (account<>'' AND account LIKE ?)
               OR  (address<>'' AND address=?)
       """, (host, account, address))

    # Set up the REGEXP operator/function for the sqlite3 database.
    #self._conn.create_function(
    #                       'REGEXP', 2, 
    #                       lambda exp, item : re.find(exp, item) != None)