【问题标题】:How to split unicode strings character by character in python?如何在python中逐个字符地拆分unicode字符串?
【发布时间】:2016-01-09 04:48:36
【问题描述】:

我的网站支持多种印度语言。用户可以动态更改语言。当用户输入一些字符串值时,我必须将字符串值拆分为单独的字符。所以,我正在寻找一种方法来编写一个适用于英语和一组精选印度语言的通用函数。我已经搜索了多个站点,但是,似乎没有通用的方法来处理此要求。有特定于语言的实现(例如,泰米尔语的 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
हिंदी
ह
ि  
ं 
द
ी

【问题讨论】:

    标签: python string unicode split


    【解决方案1】:

    解决此问题的方法是将所有“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

    【讨论】:

    • 您好,您的意思是“regex”还是“re”?我试过 're.findall(ur'\p{L}\p{M}*', name)' 并返回一个空列表。
    • 我的意思是“正则表达式”。这就是我写“正则表达式”的原因。并包含指向regex 的链接。
    • 事实证明,我不能在我的应用引擎应用程序中使用regex 模块,因为regex 不是纯python,但包含c 扩展。是否有使用 Python 的 remodule 或其他实现此问题的方法的替代解决方案?
    • 您必须使用unicodedata.category() 依次获取每个字符的类别并相应地对它们进行分组。
    • 虽然这可能适用于这种特殊情况,但\X 是提取单个字素簇的首选机制。
    【解决方案2】:

    要获得“用户感知的”字符(无论是哪种语言),请使用 \X (eXtended 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)))
    

    输出

    த
    மி
    ழ்
    हिं
    दी
    

    【讨论】:

      【解决方案3】:

      uniseg 对此非常有效,the docs 也可以。这个问题的另一个答案适用于国际 Unicode 字符,但如果用户输入 Emoji,它就会变得平淡无奇。下面的解决方案起作用:

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

      这是来自pip install uniseg==0.7.1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 2023-03-08
        • 2016-05-15
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多