Unicode 搜索不工作
Unicode search not working
考虑一下。
# -*- 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
我猜这个问题是因为 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']
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']
如果您通过 nhahtdh
提供的 link
Solving Unicode Problems in Python 2.7
您可以看到原始字符串在 bytes
中,我们正在搜索 unicode。所以它永远不会奏效。
encode()
: Gets you from Unicode → bytes
decode()
: Gets you from bytes → 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
另一种解决方案:
>>> 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
考虑一下。
# -*- 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
我猜这个问题是因为 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']
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']
如果您通过 nhahtdh
提供的 linkSolving Unicode Problems in Python 2.7
您可以看到原始字符串在 bytes
中,我们正在搜索 unicode。所以它永远不会奏效。
encode()
: Gets you from Unicode → bytes
decode()
: Gets you from bytes → 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
另一种解决方案:
>>> 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