Unicode搜索不起作用

时间:2015-10-09 06:07:51

标签: python regex python-2.7 python-unicode

考虑一下。

# -*- coding: utf-8 -*-
data = "cdbsb \xe2\x80\xa6 abc"
print data 
#prints cdbsb … abc
              ^
print re.findall(ur"[\u2026]", data )

为什么re找不到这个unicode字符?我已经检查了

\xe2\x80\xa6 === … === U+2026

4 个答案:

答案 0 :(得分:1)

我的猜测是问题是因为data是一个字节字符串。您可能将控制台编码设置为utf-8,因此在打印字符串时,控制台会将字符串转换为utf-8然后显示它(您可以在sys.stdout.encoding处查看)。因此,您将获得角色 -

但很可能re不会为你做这个解码。

如果您将data转换为utf-8编码,则在使用re.findall时会获得所需的结果。示例 -

>>> data = "cdbsb \xe2\x80\xa6 abc"
>>> print re.findall(ur"[\u2026]", data.decode('utf-8') )
[u'\u2026']

答案 1 :(得分:1)

data属于 str 类型,包含带十六进制值的ASCII字符。但搜索字词为 unicode 类型。打印功能将默认值转换为sys.stdout.encoding。当我尝试按原样打印data时,输出与data.decode('utf-8')不同。我使用的是Python 2.7

data = "cdbsb \xe2\x80\xa6 abc"
search = ur"[\u2026]"

print sys.stdout.encoding
## windows-1254

print data, type(data)
## cdbsb … abc <type 'str'>

print data.decode(sys.stdout.encoding)
## cdbsb … abc

print data.decode('utf-8')
## cdbsb … abc

print search, type(search)
## […] <type 'unicode'>

print re.findall(search, data.decode('utf-8'))
## [u'\u2026']

答案 2 :(得分:1)

如果您浏览nhahtdh

提供的链接

Solving Unicode Problems in Python 2.7

您可以看到原始字符串位于bytes,我们正在搜索unicode。所以它永远不会有效。

  

encode():从Unicode→字节

获取      

decode():从字节→Unicode

获取

以下我们可以通过两种方式解决它。

# -*- coding: utf-8 -*-
data = "cdbsb \xe2\x80\xa6 abc".decode("utf-8")  #convert to unicode
print data
print re.findall(ur"[\u2026]", data )
print re.findall(ur"[\u2026]", data )[0].encode("utf-8")  #compare with unicode byte string and then reconvert to bytes for print

data1 = "cdbsb \xe2\x80\xa6 abc"  #let it remain bytes
print data1
print re.findall(r"\xe2\x80\xa6", data1 )[0] #search for bytes

答案 3 :(得分:0)

另一种解决方案:

>>> data = "cdbsb \xe2\x80\xa6 abc"
>>> print data 
cdbsb … abc
>>> if u"\u2026".encode('utf8') in data: print True
... 
True
>>> if u"\u2026" in data.decode('utf8'): print True
... 
True