奇怪的python正则表达式行为 - 可能连接到unicode或sqlalchemy

时间:2011-11-02 22:15:48

标签: python regex sqlalchemy

我正在尝试在sqlalchemy结果中搜索一个模式(实际上是通过'like'或'op'('regexp')(模式)过滤我相信在某处植入了正则表达式 - 字符串和搜索字符串都是希伯来语,大概是(也许我错了 - ) - unicode r = u'לבן'c = u'לבן, ורוד, '的位置 当我re.search(r,c)时,我得到了SRE.match个对象 但是当我查询db时:

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

和c给了我:

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

print (c):

לבן,ורוד,

实际上相同,但正在运行re.search(r,c)没有给我匹配对象。

由于我怀疑是unicode问题,我尝试使用unicode(c)转换为unicode 我得到一个'UnicodeDecodeError:'ascii'编解码器不能解码位置0中的字节0xd7:ordinal'我想这意味着这已经是unicode字符串 - 所以这里的捕获位置是什么? 我更喜欢使用sqlalchemy 'like',但我得到同样的问题=我确切知道的地方(正如我在我的示例中所示,数据包含字符串)

我应该以某种方式转换搜索字符串吗?这与unicode有关吗?别的什么?

db表(我正在查询)整理是utf8_unicode_ci

2 个答案:

答案 0 :(得分:3)

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'לבן,ורוד,'

如果你的控制台可以显示希伯来字符。

答案 1 :(得分:2)

'\xd7\x9c\xd7\x91\xd7\x9f,\xd7\x95\xd7\xa8\xd7\x95\xd7\x93,是字符串u'לבן, ורוד, '的编码表示。所以在第二个例子中你应该写re.search(r,c.decode('utf-8')) 除了设置编码参数之外,您尝试执行的操作几乎相同。它使python尝试ascii编码