【问题标题】:Python 3 len() function for Unicode characters用于 Unicode 字符的 Python 3 len() 函数
【发布时间】:2016-05-04 05:45:10
【问题描述】:

当我们相信 Python 3 在 Unicode 上一切正常时,当我遇到这种情况时,我感到很惊讶。

>>> amma = "அம்மா"
>>> amma
'அம்மா'
>>> len(amma)
5

显然泰米尔语字符串 "அம்மா" 有 3 个字母,len("அம்மா") 的返回值为 5 绝不会被接受或欣赏。

其他 Dravidian 或 Brahmic 脚本如何解决此问题以获得正确的字符串长度?

编辑#1: 考虑到@joey 的评论,这个问题可以改写如下。

如何在 Python 中计算字素长度?

我们知道 Swift 或 Perl6 默认会这样做

  2> let amma = "அம்மா".characters.count
amma: Distance = 3

【问题讨论】:

  • @Mijago:不,不会的。
  • pypi 上的 grapheme 包似乎可以满足您的需求。我不相信只使用标准库中的工具有一个简单的解决方案(尽管 unicodedata 模块的工具可能很有用,这取决于您的需要)。

标签: python python-3.x unicode tamil


【解决方案1】:

下面的代码只计算字符并忽略 unicode 标记(使用标准 re 模块)。

import re
amma = "அம்மா"
len(re.findall("[ஃ-ஹ]", amma))

以下是获取 unicode 字母计数的最快方法(使用第三方 regex 模块)。

import regex
amma = "அம்மா"
len(regex.findall('\p{L}\p{M}*', amma))

【讨论】:

    【解决方案2】:

    pip install Open-Tamil
    

    代码

    from tamil import utf8
    amma = "அம்மா"
    letters = utf8.get_letters(amma)
    print(len(letters))
    

    【讨论】:

      【解决方案3】:

      它可能有 3 个字母,但它有 5 个字符:

      $ charinfo 'அம்மா'
      U+0B85 TAMIL LETTER A [Lo]
      U+0BAE TAMIL LETTER MA [Lo]
      U+0BCD TAMIL SIGN VIRAMA [Mn]
      U+0BAE TAMIL LETTER MA [Lo]
      U+0BBE TAMIL VOWEL SIGN AA [Mc]
      

      如果您需要更具体,则只需计算字母类别中的字符数。

      【讨论】:

      • 更准确地说:3 个字素,但 5 个代码点。不过,在 Python 中计算字符串中的字素似乎有点复杂(找不到任何好的样本)。
      • @Joey 你听上去见多识广。这让我现在快疯了:(
      • 您可以使用regex 删除您不想要的任何内容,但最困难的部分是首先弄清楚您想要什么。
      猜你喜欢
      • 2019-09-17
      • 2011-08-07
      • 2014-09-10
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多