如何只删除重音符号,而不是 Python 中的字符串中的元音变音

how to remove just the accents, but not umlauts from strings in Python

我正在使用以下代码

import unicodedata
def strip_accents(s):
    return ''.join(c for c in unicodedata.normalize('NFD', s)
              if unicodedata.category(c) != 'Mn')
strip_accents('ewaláièÜÖ')

其中return

'ewalaieUO'

但我想要它 return

'ewalaieÜÖ'

有没有比用 str.replace(char_a,char_b) 替换字符更简单的方法? 我怎样才能有效地处理这个问题?

那么让我们从您的测试输入开始:

In [1]: test
Out[1]: 'ewaláièÜÖ'

查看规范化时发生的情况:

In [2]: [x for x in unicodedata.normalize('NFD', test)]
Out[2]: ['e', 'w', 'a', 'l', 'a', '́', 'i', 'e', '̀', 'U', '̈', 'O', '̈']

这里是每个规范化元素的 unicodedata 类别:

In [3]: [unicodedata.category(x) for x in unicodedata.normalize('NFD', test)]
Out[3]: ['Ll', 'Ll', 'Ll', 'Ll', 'Ll', 'Mn', 'Ll', 'Ll', 'Mn', 'Lu', 'Mn', 'Lu', 'Mn']

如您所见,不仅"accents",还有"umlauts"都属于类别Mn。所以你可以用 unicodedata.category 代替 unicodedata.name

In [4]: [unicodedata.name(x) for x in unicodedata.normalize('NFD', test)]
Out[4]: ['LATIN SMALL LETTER E',
 'LATIN SMALL LETTER W',
 'LATIN SMALL LETTER A',
 'LATIN SMALL LETTER L',
 'LATIN SMALL LETTER A',
 'COMBINING ACUTE ACCENT',
 'LATIN SMALL LETTER I',
 'LATIN SMALL LETTER E',
 'COMBINING GRAVE ACCENT',
 'LATIN CAPITAL LETTER U',
 'COMBINING DIAERESIS',
 'LATIN CAPITAL LETTER O',
 'COMBINING DIAERESIS']

此处重音名称为 COMBINING ACUTE/GRAVE ACCENT,"umlauts" 名称为 COMBINING DIAERESIS。所以这是我的建议,如何修复您的代码:

def strip_accents(s):
    return ''.join(c for c in unicodedata.normalize('NFD', s)
              if not unicodedata.name(c).endswith('ACCENT')) 

strip_accents(test)
'ewalaieÜÖ'

此外,您还可以从该数据库中读取 unicodedata documentation this module is just a wrapper for database available here, so please take a look at list of names,以确保这涵盖了您需要的所有情况。