为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中计算 Unicode 文本中的非间距字符的最快方法

在 Python 中计算 Unicode 文本中的非间距字符的最快方法

倚天杖 2021-10-19 15:37:56
鉴于 Unicode 非空格标记列表 - https://www.fileformat.info/info/unicode/category/Mn/list.htmUNICODE_NSM = ['\u0300', '\u0301', '\u0302', '\u0303', '\u0304', '\u0305', '\u0306', '\u0307', '\u0308', '\u0309', '\u030A', '\u030B', '\u030C', '\u030D', '\u030E', '\u030F', '\u0310', '\u0311', '\u0312', '\u0313', '\u0314', '\u0315', '\u0316', '\u0317', '\u0318', '\u0319', '\u031A', '\u031B', '\u031C', '\u031D', '\u031E', '\u031F', 笔记。 请注意,我们在这里有\U000XXXXX和\uXXXX代表。我想计算像这个印地语字符串“अब यहां से कहा जाएँ हम”这样的 Unicode 输入文本,或者只是一个像“समझा”这样的标记词,不包括非空格字符。我的实现看起来像def countNonSpacingCharString(str):  count = 0;  for char in str:    if char not in UNICODE_NSM:      count = count + 1  return count感谢以下答案中提供的帮助,我已将所有内容放在此 github 中。还有一个可以在 JavaScript / Node.js 中使用的标记代码点列表 - https://github.com/loretoparisi/unicode_marks
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

也许最简单的方法是使用unicodedata模块。部分是因为它将接受更严格的测试。确实,我发现您的列表似乎包括除Mn. 也就是说,它也包括来自Mc(Mark,间距组合)的Unicode 点,但是您说您只想从Mn(Mark,Nonspacing)中排除 Unicode 点。


例如。


import unicodedata 


def countNonSpacingCharString(string):

    category = unicodedata.category

    return sum(category(char) != 'Mn' for char in string)

根据 ,这似乎快了大约 60 倍timeit。


TypeError如果您的 Python 版本unicodedata不是最新的,因此您不知道最近添加到 Unicode的内容,您可能会得到, 。您可以通过安装unicodedata2和使用它来解决这个问题。


查看完整回答
反对 回复 2021-10-19
  • 1 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信