让我们从您的测试输入开始:
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']
如您所见,“重音”和“元音变音”都属于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,“变音符号”名称是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 中读取此模块只是一个可用数据库here 的包装器,因此请查看该数据库中的list of names,以确保它涵盖了您需要的所有情况。