提问人:xaviersjs 提问时间:8/23/2019 更新时间:9/6/2019 访问量:356
如何在 python 中将修饰的拉丁 unicode 字符转换为普通拉丁语
How do I convert decorated latin unicode characters to plain latin in python
问:
Unicode 指定了可以对拉丁字符进行的一系列修改。如何在python中将这些unicode字符转换为普通拉丁字符?
需要明确的是,我不是在问如何摆脱字母中的重音。我问的是如何转换在语言上具有相同含义的东西,但一些装饰的显示器,如负片、包围、封闭在盒子里的显示器类型。
例如,我如何转换
💦 °原来°💦 C
自
💦 °原来°💦 C
(剥离这些非语言字符将是一项单独的任务)
答:
1赞
Kevin Welch
8/23/2019
#1
最简单的方法是自己制作转换图。
像这样:
conversion_map = {'🄾': 'o', '🅁': 'r', '🄸': 'i'}
我不知道转换这些值的简单逻辑方法......但有人随时纠正我。
您也可以在此处寻找其他想法。Latin-1 为 ASCII
评论
1赞
wjandrea
8/23/2019
Alyssa 的答案可能是最好的解决方案,但 FWIW,使用 和 更容易,例如str.maketrans
str.translate
trans = str.maketrans('🄰🄱🄲', 'ABC'); '🄰🄱🄱🄰'.translate(trans)
-> 'ABBA'
11赞
Alyssa Haroldsen
8/23/2019
#2
这并不完美,但你要找的是像Unicode分解这样的东西。Unicode规范化和分解的概念本身就是一本书。
对于快速而肮脏的东西,幸运的是,Python 为你内置了这个!
>>> import unicodedata
>>> unicodedata.normalize('NFKC', '💦°🄾🅁🄸🄶🄸🄽🄰🄻°💦 c')
'💦°ORIGINAL°💦 c'
1赞
xaviersjs
9/6/2019
#3
尽管我接受了 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)
评论
0赞
Alyssa Haroldsen
5/20/2020
作为提示,更改为一组可能会加快速度。keep_categories
0赞
xaviersjs
5/21/2020
嗯,你真的让我想知道。我见过小集合的搜索算法在线性时间算法中比对数算法表现得更好。但在这种情况下,匹配集很小,但与之匹配的项目数量很大。我想这使得它与 M >> N 一起成为 O(M log(N))。我无法从分析上弄清楚这一点,但我真的很想看看实际的分析结果会返回什么。你有什么想法?谢谢你提到它!对于处理未知长度字符串的函数来说,性能绝对很重要!
0赞
xaviersjs
5/23/2020
我认为从Big-O的意义上说,你绝对是对的。M*log(6) 远小于 M*6 :D谢谢你的建议!
下一个:有符号/无符号特征编程
评论