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

How to reformat strings to not include accented letters in Python?

本问题已经有最佳答案,请猛点这里访问。

我正试图从Python中的csv文件列中列出位置。

这是列中的一个条目:

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

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

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

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

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

它抛出错误:

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

我应该使用什么命令?

谢谢!


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

要完全删除:

1
2
3
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码。

1
2
3
4
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']


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

1
2
>>> [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']

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