如何在python中返回非Ascii字母的str表示

时间:2017-06-20 08:21:39

标签: string python-2.7 python-unicode representation

我有一个代码段,可以将葡萄牙语文本与数字分开。代码是:

import re
def name():
    text = u'Obras de revisão e recuperação (45453000-7)'
    splits = text.split(u" (")
    return(str(splits[0].encode("utf8")))
name()

,输出为:'Obras de revis\xc3\xa3o e recupera\xc3\xa7\xc3\xa3o'

但是当我写

print(splits[0].encode("utf8"))

输出结果为:Obras de revisão e recuperação这是我想要的结果。

但它不适用于return函数。我读了difference between __str__ and __repr__,但是,我仍然无法在函数内部返回与__str__相同的输出。

1 个答案:

答案 0 :(得分:1)

你正在思考这个问题。您使用unicode字面值来制作unicode对象,然后您的splits列表将包含unicode个对象:

In [4]: def name():
   ...:     text = u'Obras de revisão e recuperação (45453000-7)'
   ...:     splits = text.split(u" (")
   ...:     return splits
   ...:

In [5]: splits = name()

In [6]: splits
Out[6]: [u'Obras de revis\xe3o e recupera\xe7\xe3o', u'45453000-7)']

当在屏幕上打印list时,会使用__repr__中包含的list个对象。但是,如果您需要__str__,只需使用print

In [7]: for piece in splits:
   ...:     print(piece)
   ...:
Obras de revisão e recuperação
45453000-7)

注意,.encode 会返回一个字节字符串,即常规的非unicode Python 2 str。在其上调用str本质上是身份功能,当您str时它已经是encode

In [8]: splits[0].encode('utf8')
Out[8]: 'Obras de revis\xc3\xa3o e recupera\xc3\xa7\xc3\xa3o'

In [9]: str(splits[0].encode('utf8'))
Out[9]: 'Obras de revis\xc3\xa3o e recupera\xc3\xa7\xc3\xa3o'

你应该真的,真的考虑使用Python 3,它简化了这一点。 Python 3中的str对应于Python 2 unicode,而Python 2 str对应于Python 3 bytes对象。

因此,为了澄清事情,您的name函数应该像这样工作:

In [16]: def name():
    ...:     text = u'Obras de revisão e recuperação (45453000-7)'
    ...:     splits = text.split(u" (")
    ...:     return splits[0]
    ...:

In [17]: print(name())
Obras de revisão e recuperação