Python Unicode搜索不起作用

Python Unicode搜索不起作用,python,regex,python-2.7,python-unicode,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 我猜问题是因为数据是一个字节字符串。您可能将控制台编码为utf-8,因此在打印字符串时,控

想想这个

# -*- 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

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

但最有可能的是,
re
不会为您执行此解码

如果将
数据
转换为
utf-8
编码,则在使用
re.findall
时会得到所需的结果。范例-

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

数据
str类型,包含带十六进制值的ASCII字符。但是搜索词是unicode类型的。打印功能将默认值转换为
sys.stdout.encoding
。当我尝试按原样打印
数据时,输出与
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']
data=“cdbsb\xe2\x80\xa6 abc”
search=ur“[\u2026]”
打印sys.stdout.encoding
##windows-1254
打印数据,类型(数据)
##cdbsb–abc
打印数据。解码(系统标准编码)
##cdbsb–abc
打印数据。解码('utf-8')
##cdbsb…abc
打印搜索,键入(搜索)
## […] 
打印关于findall(搜索、数据解码('utf-8'))
##[u'\u2026']

如果您通过

您可以看到原始字符串的大小为
字节
,我们正在搜索unicode。因此,它本不应该起作用

encode()
:从Unicode获取→ 字节

decode()
:从字节中获取→ 统一码

下面我们可以用两种方法来解决它

# -*- 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

你的意思是说,
print
会自动执行吗?它也不会打印
实际上它会转换为控制台使用的编码-
sys.stdout.encoding
@vks我正在试着找到一些相关的参考资料。到目前为止,我只能找到-。@vks我相信它将是执行解码/编码的控制台,而不是python。我不知道这是否有帮助,但是
如果u“\u2026”。数据中的encode('utf8'):print True
适合我;)我做了一个简短的评论,我不能复制它。不久之后,我发现了一个错误并删除了评论。我想为在这里显示几分钟的错误信息道歉。就我个人而言,我没有理由使用第二种方法。在Python2中,如果处理字符数据,则应始终使用
unicode
type。在正则表达式源代码中使用文字Unicode字符时,使用
str
可能会隐藏错误。