如何重新格式化字符串以不包括Python中的重音字母?

时间:2014-06-23 15:20:13

标签: python string

我正在尝试用Python中的csv文件列创建位置列表。

这是专栏中的一个条目:

Rio Balira del Orien,Riu Valira d'Orient,Riu Valira d’Orient,Río Balira del Orien

这是当前状态下的相应列表:

locs = ['Rio Balira del Orien', "Riu Valira d'Orient", 'Riu Valira d\xe2\x80\x99Orient', 'R\xc3\xado Balira del Orien']

在我的程序中,我需要检查一个给定的单词是否在列表中,所以我试图删除重音字母,撇号等的疯狂字符串格式(例如\xc3\xad = í)。每个位置都是简单的小写ascii。当我尝试使用代码时

loclist = [x.encode('ascii').lower() for x in locs]

它会抛出错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 12: ordinal not in range(128)

我应该使用什么命令?

谢谢!

2 个答案:

答案 0 :(得分:1)

locs = ['Rio Balira del Orien', "Riu Valira d'Orient", 'Riu Valira d\xe2\x80\x99Orient', 'R\xc3\xado Balira del Orien']

完全删除:

print [unicode(x,errors="ignore") for x in locs]

[u'Rio Balira del Orien', u"Riu Valira d'Orient", u'Riu Valira dOrient', u'Ro Balira del Orien']

编码为ascii。

import unicodedata
print [unicodedata.normalize('NFD', x.decode('utf-8')).encode('ascii', 'ignore') for x in locs]

['Rio Balira del Orien', "Riu Valira d'Orient", 'Riu Valira dOrient', 'Rio Balira del Orien']

答案 1 :(得分:0)

您不能将重音字符编码为ascii,您必须使用支持更大字符集的扩展编码类型。现在,您有一个包含UTF-8编码字符串的列表,这是一种合理的存储方式。您可以将它们解码为unicode对象,这是一个很好的最佳做法:

>>> [l.decode('utf-8') for l in locs]
[u'Rio Balira del Orien', u"Riu Valira d'Orient", u'Riu Valira d\u2019Orient', u'R\xedo Balira del Orien']

您需要确保在执行将字符串写入磁盘之前重新编码字符串,这需要编码字符串。您可以通过调用encode('utf-8')对象上的unicode来执行此操作。