2011-03-19 28 views
9

Intento verificar una cadena con un patrón usando una expresión regular con python en una base de datos sqlite. tengo un problema cuando intento cadena de búsqueda de tener "con un patern usando" Para exemple:Problema con regexp python y sqlite

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()) 

Debería \" antes de expresión regular de otro modo el compilador no tiene gusto ... de error syntaxe

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

Alguien sabe cómo hacer que

Mi función expresión regular:? con.create_function ("expresión regular", 2, expresión regular)

Respuesta

20

Uso parametrizada sql. Entonces no es necesario para escapar de las cotizaciones a sí mismo:

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) 

produce

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

Muchas gracias, esto realmente ayudó. –

1

puede utilizar el triple escapes, o una cadena sin procesar.

su hacer:

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

utilizar una cadena prima, que es un 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\"' 

o triple escapa (\\\):

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