如何 return str 表示 python 中的非 Ascii 字母

How to return str representation of non- Ascii letters in python

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

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__,但是,我仍然不知道如何使用函数内部的 return 获得与 __str__ 相同的输出。

你想多了。您使用 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 打印到屏幕时,使用 list 中包含的对象的 __repr__。但是,如果您想要 __str__,只需使用 print:

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

注意,.encode returns 一个字节串,即一个常规的非unicode Python 2 str。在它上面调用 str 本质上是身份函数,当你 encode 它时它已经是一个 str:

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,它可以简化这一过程。 Python3中的str对应Python2unicode,Python2str对应Python3bytes 对象。

所以,为了澄清事情,你的 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