Python 把重音和字母分开

Python 把重音和字母分开,python,unicode,Python,Unicode,我正在寻找一个函数,它将接受一个复合字母并将其拆分,就像您必须在US-INTL键盘上键入一样,如下所示: 'ȯ' becomes ".o" 'â' becomes "^a" 'ë' becomes "\"e" 'è' becomes "`e" 'é' becomes "'e" 'ñ' becomes "~n" 'ç' becomes ",c" 等

我正在寻找一个函数,它将接受一个复合字母并将其拆分,就像您必须在US-INTL键盘上键入一样,如下所示:

'ȯ' becomes ".o"
'â' becomes "^a"
'ë' becomes "\"e"
'è' becomes "`e"
'é' becomes "'e"
'ñ' becomes "~n"
'ç' becomes ",c"
等等

但在搜索这个问题时,我只能找到完全消除重音的函数,这不是我想要的

以下是我想要实现的目标:

展开此字符串:

ha láeïschëría ha láeïsch

插入此字符串:


“er'i'i'aha l'a e”isch

您可以使用字典将字符与其替换项进行匹配,然后在字符串上迭代以进行实际替换

word_rep = dict(zip(['ȯ','â','ë','è','é','ñ','ç'] 
['.o','^a','\"e','`e','\'e','~n',',c']))
mystr = 'ër íí àha lá eïsch'
for key,value in word_rep.items():
    mystr = mystr.replace(key,value)

下面使用Unicode分解将组合标记与拉丁字母分开,使用正则表达式交换组合字符及其字母,然后使用翻译表将组合标记转换为国际键盘上使用的键:

import unicodedata as ud
import re

replacements = {'\N{COMBINING DOT ABOVE}':'.',
                '\N{COMBINING CIRCUMFLEX ACCENT}':'^',
                '\N{COMBINING DIAERESIS}':'"',
                '\N{COMBINING GRAVE ACCENT}':'`',
                '\N{COMBINING ACUTE ACCENT}':"'",
                '\N{COMBINING TILDE}':'~',
                '\N{COMBINING CEDILLA}':','}

combining = ''.join(replacements.keys())
typing = ''.join(replacements.values())

translation = str.maketrans(combining,typing)

s = 'ër íí àha lá eïsch'
s = ud.normalize('NFD',s)
s = re.sub(rf'([aeiounc])([{combining}])',r'\2\1',s)
s = s.translate(translation)
print(s)
输出:

“呃'我'我'啊哈我'啊”是

这不完全是您想要的,但是使用Unicode数据转换为Unicode的分解范式。normalize()可能是正确的一步。考虑到键盘布局的极端可变性,我怀疑是否有一个打包的一步解决方案可用。@TurePålsson我添加了它应该在US-INTL键盘上遵循的规范。我尝试了
unicodedata.normalize('NFD',“Ä”)
,它返回了A(good)和一个奇怪的特定变音字符(bad)。我想我可以找到并替换那些变音符号,但我想我会等待更好的解决方案。由于normalize()以错误的顺序插入了对,我还需要反转它们。我怀疑是否有比Unicode规范化加替换更好的解决方案(您还必须交换位置,因为组合变音符号在基字符之后)。您的需求是特定的和任意的,这就是您可能必须创建自己的映射表的原因。如果你认为组合变音符号很奇怪,如果你深入研究Unicode,你会感到惊讶。。。