Поэтому я хотел обновить таблицу, в которой мне нужно изменить содержимое определенного столбца. Для обновленного значения мне нужно использовать RegEx. К счастью, моя БД — MariaDB, поэтому она поддерживает REGEXP_REPLACE.
Теперь я написал скрипт Python, который должен делать следующее: взять список строк (скажем, слов) и, если значение столбца начинается с одной из этих строк, удалить его. SQL-запрос должен быть в основном таким:
REGEXP_REPLACE(column, '(?i)^(%s\\s+)', '');
т. е. я делаю совпадение без учета регистра, когда в начале значения столбца появляется определенная строка (указанная %s
), за которой следует любое количество пробелов.
Теперь, когда я пытаюсь поместить это в сценарий, я сталкиваюсь с несколькими проблемами, в зависимости от того, как я ввожу параметр в запрос.
Использование интерполяции строк Я знаю, что это не лучший способ сделать это, но вот как это выглядит:
sql = "UPDATE `table` SET `column` = REGEXP_REPLACE(`column`, '(?i)^(%s\\\\s+)', '');" % (term) cursor.execute(sql)
Когда я использую это,
term
вставляется правильно (я проверяюprint(cursor.mogrify(sql, (term,)))
), но у меня возникают проблемы, еслиterm
содержит какие-либо символы, которые должны быть экранированы в регулярном выражении, например.-
.Использование выполнения с параметрами Это более чистый вариант, но здесь возникает другая проблема — строка вставляется вместе с кавычками. Что нарушает все утверждение, потому что в нем также есть кавычки. Итак, вот код:
sql = "UPDATE `table` SET `column` = REGEXP_REPLACE(`column`, '(?i)^(%s\\\\s+)', '');" cursor.execute(sql, (term,))
Но это приводит к таким утверждениям:
UPDATE `table` SET `column` = REGEXP_REPLACE(`column`, '(?i)^('example'\\s+)', '');
со строкой в кавычках внутри регулярного выражения, которое также находится в кавычках.
Любые предложения, как я могу решить эту проблему? Мне нужно иметь замещающие термины внутри регулярного выражения без кавычек, но также, если внутри заменяющих терминов есть какие-либо специальные символы, их нужно экранировать. Возможно, мне нужно написать для этого отдельную функцию, но я не уверен. Я не очень хорошо разбираюсь в Python и в SQL.
Заранее спасибо за любые подсказки.
% (re.escape(term))
первым методом. - person Wiktor Stribiżew   schedule 06.04.2017