#python #sqlite
#питон #sqlite
Вопрос:
Я хочу использовать оператор регулярных выражений в своих запросах sqlite, поэтому я реализовал функцию регулярных выражений:
import sqlite3
import re
def regexp(pattern,string):
print('(pattern,string) = ', pattern,string)
try:
regex = re.compile(pattern,re.I)
return regex.search(string) is not None
except Exception,e:
print(e)
return False
conn = sqlite3.connect(':memory:')
conn.create_function('REGEXP',2,regexp)
cursor = conn.cursor()
pattern = 'bc'
print('pattern =',pattern,)
cursor.execute("SELECT 'abc' REGEXP ? ;",(pattern,))
if (cursor.fetchone() == (1,)):
print('Regex matches')
else:
print('Regex does not match')
cursor.close()
conn.close()
Если я запускаю это в Python 2.7 (который я должен использовать для этого проекта), я получаю следующее:
> ('pattern =', 'bc')
> ('(pattern,string) = ', u'bx00', u'ax00b')
> Regex does not match
В итоге я получаю строки с неизменной длиной, если мы посчитаем нулевые байты, но фактически они содержат только первую половину исходных символов. Я не могу понять, почему.
Запустив тот же код в Python 2.6, он работает так, как ожидалось:
> ('pattern =', 'bc')
> ('(pattern,string) = ', u'bc', u'abc')
> Regex matches
Как я могу заставить это работать в Python 2.7?
Я предполагаю, что обходным путем было бы удвоить каждый символ в моих строках перед отправкой их в cursor.execute, а затем удалить нулевые байты в функции регулярного выражения, но я хотел бы получить более чистое решение, если оно существует.
Комментарии:
1. Если вы используете python 2, вам следует добавить оператор future, если вы используете print как функцию. В любом случае, это работает на моей машине (WSL Debian, Python 2.7.18), поэтому я подозреваю, что это, вероятно, какая-то проблема с кодировкой Windows. Можете ли вы предоставить более подробную информацию о своей среде?
2. Я запускаю это на CentOS 6.10 с Python 2.7.13 и 2.6.6
3. Если вы внедрили нули в свою строку, это явный намек на то, что она закодирована в формате UTF-16.
4. Интересно. Как мне с этим справиться?