Проблема с регулярным выражением Python и SQLite - PullRequest
10 голосов
/ 20 марта 2011

Я пытаюсь проверить строку с шаблоном, используя регулярное выражение с python в базе данных 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())

Мне следует \ "до регулярного выражения, иначе компилятору не понравится ... синтаксическая ошибка

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

Кто-нибудь знает, как это сделать?

Моя функция регулярного выражения: con.create_function ("регулярное выражение", 2, регулярное выражение)

Ответы [ 3 ]

24 голосов
/ 20 марта 2011

Используйте параметризованный 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 голос
/ 20 марта 2011

Вы можете использовать тройные escape-символы или необработанную строку.

Вы делаете:

>>> 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\"'
0 голосов
/ 27 сентября 2018

Другой пример параметризованного запроса ...

Для ситуации, когда вы должны предоставить свою собственную функцию 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...