Python:在多语言(例如中文和英文)字符串上执行此"混合"split()的任何方法?

Con*_*ion 9 python string unicode multilingual cjk

我有多种语言的字符串,包括使用空格作为单词分隔符(英语,法语等)的语言和不使用空格的语言(中文,日语,韩语).

给定这样的字符串,我想将英文/法文/等部分分成使用空格作为分隔符的单词,并将中文/日文/韩文部分分成单个字符.

我想将所有这些分离的组件放入一个列表中.

一些例子可能会说明这一点:

案例1:仅英文字符串.这种情况很简单:

>>> "I love Python".split()
['I', 'love', 'Python']
Run Code Online (Sandbox Code Playgroud)

案例2:仅限中文的字符串:

>>> list(u"????")
[u'\u6211', u'\u7231', u'\u87d2', u'\u86c7']
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以将字符串转换为中文字符列表.但是在列表中我得到了unicode表示:

[u'\u6211', u'\u7231', u'\u87d2', u'\u86c7']
Run Code Online (Sandbox Code Playgroud)

如何让它显示实际字符而不是unicode?就像是:

['?', '?', '?', '?']
Run Code Online (Sandbox Code Playgroud)

??

案例3:英文和中文混合:

我想转一个输入字符串,如

"??Python"
Run Code Online (Sandbox Code Playgroud)

并把它变成这样的列表:

['?', '?', 'Python']
Run Code Online (Sandbox Code Playgroud)

有可能做那样的事吗?

Gle*_*ard 6

我以为我也会展示正则表达式方法.这对我来说不合适,但这主要是因为我所看到的所有特定于语言的i18n奇怪让我担心正则表达式可能对所有这些都不够灵活 - 但你可能根本不需要任何那个.(换句话说 - 过度设计.)

# -*- coding: utf-8 -*-
import re
def group_words(s):
    regex = []

    # Match a whole word:
    regex += [ur'\w+']

    # Match a single CJK character:
    regex += [ur'[\u4e00-\ufaff]']

    # Match one of anything else, except for spaces:
    regex += [ur'[^\s]']

    regex = "|".join(regex)
    r = re.compile(regex)

    return r.findall(s)

if __name__ == "__main__":
    print group_words(u"Testing English text")
    print group_words(u"????")
    print group_words(u"Testing English text????")
Run Code Online (Sandbox Code Playgroud)

在实践中,您可能只想编译一次正则表达式,而不是每次调用.再次,填写字符分组的细节取决于您.


Win*_*Lin 5

在 Python 3 中,如果需要,它还会拆分数字。

\n\n
def spliteKeyWord(str):\n    regex = r"[\\u4e00-\\ufaff]|[0-9]+|[a-zA-Z]+\\\'*[a-z]*"\n    matches = re.findall(regex, str, re.UNICODE)\n    return matches\n\nprint(spliteKeyWord("Testing English text\xe6\x88\x91\xe7\x88\xb1Python123"))\n
Run Code Online (Sandbox Code Playgroud)\n\n

=> [\'测试\', \'英语\', \'文本\', \'\xe6\x88\x91\', \'\xe7\x88\xb1\', \'Python\', \ ‘123\’]

\n