странное поведение регулярных выражений Python - возможно, связано с Unicode или sqlalchemy - PullRequest
3 голосов
/ 03 ноября 2011

Я пытаюсь найти шаблон в результатах sqlalchemy (на самом деле фильтр по 'like' или 'op' ('regexp') (pattern), который, как мне кажется, имплантирован где-то с регулярным выражением) - строка и поиск Строка есть как на иврите, так и предположительно (возможно я ошибаюсь) - юникод где r = u'לבן' и c = u'לבן, ורוד, ' когда я re.search(r,c) я получаю SRE.match объект но когда я запрашиваю БД, как:

f = session.query(classname)
c = f[0].color

и с дает мне:

'\xd7\x9c\xd7\x91\xd7\x9f,\xd7\x95\xd7\xa8\xd7\x95\xd7\x93,'

или print (c):

לבן,ורוד,

практически то же самое, но выполнение re.search(r,c) не дает мне никакого соответствия.

Так как я подозревал проблему с Unicode, я попытался преобразовать в Unicode с unicode(c) и я получаю кодек «UnicodeDecodeError:« ascii »не может декодировать байт 0xd7 в позиции 0: ординал», что, я думаю, означает, что это уже строка в кодировке Unicode - так в чем здесь подвох? Я бы предпочел использовать sqlalchemy 'like', но у меня та же проблема там = где я точно знаю (как я показал в своем примере, что данные содержат строку)

Должен ли я каким-то образом преобразовать строку поиска, шаблон? это связано с юникодом? что-то еще?

Сортировка таблицы БД (которую я запрашиваю): utf8_unicode_ci

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011
c = f[0].color

возвращает не строку Unicode (или ее repr() будет отображать строку типа u'...'), но строку в кодировке UTF-8.

Попробуйте

c = f[0].color.decode("utf-8")

, что приводит к

u'\u05dc\u05d1\u05df,\u05d5\u05e8\u05d5\u05d3,'

или

u'לבן,ורוד,'

если ваша консоль может отображать ивритские символы.

2 голосов
/ 03 ноября 2011

'\xd7\x9c\xd7\x91\xd7\x9f,\xd7\x95\xd7\xa8\xd7\x95\xd7\x93, - закодированное представление строки u'לבן, ורוד, '.Итак, во втором примере вы должны написать re.search(r,c.decode('utf-8')) Вы пытаетесь сделать почти то же самое, кроме установки параметра кодирования.Это заставляет Python попробовать ASCII кодировку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...