我正在使用以下代码
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èÜÖ')
返回
'ewalaieUO'
但我想让它回来
'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']
如您所见,不仅“口音”,而且“元音变音”都属于
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 以确保它涵盖了您需要的所有情况。
关于python - 如何仅删除重音,而不是从 Python 中的字符串中删除变音符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44576486/