Python 3中,针对Unicode字符的len()函数

5

虽然我们相信 Python 3 在 Unicode 方面已经做得很好了,但在我遇到这种情况时还是感到惊讶。

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

显然,泰米尔字符串"அம்மா"有3个字母,不能接受或赞赏len("அம்மா")的返回值为5。其他德拉维达语或婆罗米文字如何解决此问题以获得正确的字符串长度呢?编辑#1:考虑到@joey的评论,可以将此问题重新表述如下。 如何在Python中计算音素长度?我们知道Swift或Perl6默认执行此操作。
  2> let amma = "அம்மா".characters.count
amma: Distance = 3

@Mijago:不,它不会。 - Joey
1
在pypi上,grapheme软件包似乎可以实现您想要的功能。我认为仅使用标准库中的工具并没有简单的解决方案(尽管unicodedata模块的工具可能会根据您的需求有所帮助)。 - snakecharmerb
3个回答

2

它只有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
更准确地说,是3个字形,但5个编码点。在Python中计算字符串中的字形似乎有点复杂(找不到好的示例)。 - Joey
@Joey,你听起来很有经验。这让我现在感到非常烦恼 :( - nehem
你可以使用regex来去除任何你不想要的内容,但难点在于首先确定你想要什么。 - Ignacio Vazquez-Abrams

-2

以下代码仅计算字符,忽略Unicode标记(使用标准re模块)。

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

以下是使用第三方regex模块在Unicode中获取字母计数的最快方法。
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))

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