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

鉴于 Unicode 非空格标记列表 - https://www.fileformat.info/info/unicode/category/Mn/list.htm


UNICODE_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


倚天杖
浏览 190回答 1
1回答

互换的青春

也许最简单的方法是使用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和使用它来解决这个问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python