如何在Python中将带有装饰的拉丁Unicode字符转换为普通拉丁字符

5
Unicode规定了一些可以对拉丁字符进行的修改。我该如何在Python中将这些Unicode字符转换为普通的拉丁字符呢?
需要澄清的是,我不是在问如何去掉字母上的重音符号,而是在问如何转换那些在语言学意义上具有相同含义但具有装饰性显示(如负数、环绕、封闭在盒子中等)的内容。
例如,我如何将

°° c

转换为

°ORIGINAL° c

(去除那些非语言字符将是另一个任务)
3个回答

11

这并不完美,但你需要的类似于Unicode分解。Unicode的规范化和分解是一本书的内容。

如果你需要快速处理,幸运的是,Python已经为您内置了相关函数

>>> import unicodedata
>>> unicodedata.normalize('NFKC', '°° c')
'°ORIGINAL° c'

1

最简便的方法是自己制作一个转换映射表。
类似于:

conversion_map = {'': 'o', '': 'r', '': 'i'}

我不知道有没有简单的逻辑方式来转换这些值...但欢迎有人纠正我。

您也可以在这里查看其他想法。 latin-1转ascii


1
Alyssa的回答可能是最好的解决方案,但是顺便说一下,使用str.maketransstr.translate更容易,例如:trans = str.maketrans('', 'ABC'); ''.translate(trans) -> 'ABBA' - wjandrea

1
尽管我接受了Alyssa Haroldsen的答案,但我也想提供一个解决我真正需求的替代方案。如果只保留字母字符,不仅会去除修饰符字符,还会去除各种非字母字符(如表情符号和数学符号)。
我担心会去除汉字或其他非拉丁字符,但显然所有语言的字符都被Unicode标准视为字母。
# only keep letters, which apparently includes all kinds of languages https://www.compart.com/en/unicode/category/Lo
keep_categories = ('Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Zs')
filtered_string  = ' '.join(''.join(filter(lambda c: unicodedata.category(c) in keep_categories, w)) for w in words)

作为提示,将 keep_categories 更改为集合可能会加快速度。 - Alyssa Haroldsen
嗯,你让我有些疑惑了。我曾经看到过对于小数据集来说,使用线性时间算法比对数时间算法更好的搜索算法。但在这种情况下,匹配集很小,但要与之匹配的项数很大。我猜这使得它成为O(M log(N)),其中M >> N。我无法通过分析来完全理解它,但我非常想看看实际的分析结果。你有什么想法?谢谢提醒!性能对于处理未知长度字符串的函数确实很重要! - xaviersjs
我从Big-O角度考虑,你肯定是对的。Mlog(6)远远小于M6 :D谢谢建议! - xaviersjs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接