如何在python中逐个字符地拆分unicode字符串?

时间:2015-10-11 18:42:41

标签: python string unicode split

我的网站支持多种印度语言。用户可以动态更改语言。当用户输入一些字符串值时,我必须将字符串值拆分为单独的字符。所以,我正在寻找一种方法来编写一个适用于英语和一组精选印度语言的通用功能。我搜索过各个站点,但是,似乎没有通用的方法来处理这个要求。有特定于语言的实现(例如,泰米尔语的Open-Tamil包实现了get_letters)但我找不到一种常见的方法来分割或迭代unicode字符串中的字符,并考虑字素。

我尝试过的众多方法之一:

name = u'தமிழ்'
print name
for i in list(name):
  print i

#expected output
தமிழ்
த
மி
ழ்

#actual output
தமிழ்
த
ம
ி
ழ
்

#Here is another an example using another Indian language
name = u'हिंदी'
print name
for i in list(name):
  print i

#expected output
हिंदी
हिं
दी

#actual output
हिंदी
ह
ि  
ं 
द
ी

3 个答案:

答案 0 :(得分:6)

获得用户感知"无论语言是什么字符,请使用\XeXtended grapheme cluster)正则表达式:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import regex # $ pip install regex

for text in [u'தமிழ்', u'हिंदी']:
    print("\n".join(regex.findall(r'\X', text, regex.U)))

输出

த
மி
ழ்
हिं
दी

答案 1 :(得分:4)

解决这个问题的方法是将所有" L"类别字符及其随后的" M"类别字符:

>>> regex.findall(ur'\p{L}\p{M}*', name)
[u'\u0ba4', u'\u0bae\u0bbf', u'\u0bb4\u0bcd']
>>> for c in regex.findall(ur'\p{L}\p{M}*', name):
...   print c
... 
த
மி
ழ்

regex

答案 2 :(得分:1)

uniseg对此非常有效,the docs也可以。这个问题的另一个答案适用于国际Unicode字符,但如果用户输入表情符号则会失败。 下面的解决方案将工作:

>>> emoji = u''
>>> from uniseg.graphemecluster import grapheme_clusters
>>> for c in list(grapheme_clusters(emoji)):
...     print c
...




这是pip install uniseg==0.7.1