【问题标题】:How to reformat strings to not include accented letters in Python? [duplicate]如何重新格式化字符串以不包括 Python 中的重音字母? [复制]
【发布时间】: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)

我应该改用什么命令?

谢谢!

【问题讨论】:

    标签: python string


    【解决方案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') 来做到这一点。

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      相关资源
      最近更新 更多