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

Posted

技术标签:

【中文标题】如何重新格式化字符串以不包括 Python 中的重音字母? [复制]【英文标题】:How to reformat strings to not include accented letters in Python? [duplicate] 【发布时间】:2014-08-13 16:59:49 【问题描述】:

我正在尝试从 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)

我应该改用什么命令?

谢谢!

【问题讨论】:

【参考方案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']

【讨论】:

我想这行得通,如果 OP 可以完全丢失重音字符。【参考方案2】:

您不能将重音字符编码为 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']

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

【讨论】:

以上是关于如何重新格式化字符串以不包括 Python 中的重音字母? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 React/Redux reducer 中,如何以不可变的方式更新嵌套数组中的字符串?

以不安全的格式保存数字签名邮件时,如何抑制是/否提示?

如何使 jqueryUI datepicker 以不同于显示的格式提交?

如何删除 URL 中的参数并将其显示在地址栏中而不会导致 Javascript 中的重定向?

当我将富文本格式的字符串从 Python 写入文件时,我可以重新格式化它们吗?

如何在Java中以不区分大小写的方式检查一个字符串是不是包含另一个字符串?