用Python按3字节UTF8字符拆分Unicode字符串

3
假设我们有一个Python的Unicode字符串:
s = u"abc你好def啊"
现在我想按非ASCII字符拆分,结果如下:
result = ["abc", "你好", "def", "啊"]
那么,如何实现呢?

1
这个问题实际上与标题所示的字符的UTF-8编码有关吗?听起来你只是想将Unicode字符串拆分为ASCII和非ASCII代码点的组。 - Dolda2000
4个回答

5

使用正则表达式,您可以简单地在“有或没有”a-z字符之间拆分。

>>> import re
>>> re.findall('([a-zA-Z0-9]+|[^a-zA-Z0-9]+)', u"abc你好def啊")
["abc", "你好", "def", "啊"]

或者,使用所有的ASCII字符。
>>> ascii = ''.join(chr(x) for x in range(33, 127))
>>> re.findall('([{}]+|[^{}]+)'.format(ascii, ascii), u"abc你好def啊")
['abc', '你好', 'def', '啊']

或者,就像@Dolda2000建议的那样,更简单。
>>> re.findall('([ -~]+|[^ -~]+)', u"abc你好def啊")
['abc', '你好', 'def', '啊']

从技术上讲,这个问题涉及到任何ASCII字符,而不仅仅是字母数字字符。当然,这个例子并没有明确表明这是否是一个问题,我只是这么说。 - Dolda2000
1
可以说,你可以只使用[ -~]。 :) - Dolda2000

2
你可以像这样做:

你可以这样做:

s = u"abc你好def啊"
status = ord(s[0]) < 128 
word = ""
res =[]

for b, letter  in zip([ ord(c) < 128 for c in s ], s):
      if b != status:
          res.append(word)
          status = b
          word = ""
      word += letter
res.append(word)

print res
>> ["abc", "你好", "def", "啊"]

1
不错的解决方案,我发现我可以将128更改为0x07FF以通过2字节字符进行拆分!非常感谢! - Peng Qu

1
s = "abc你好def啊"
filter(None, re.split('(\w+|\W+)', s))

适用于Python 2.x版本的工作


1
list(filter(None, re.split('(\w+|\W+)', s))) 结果 ['abc你好def啊']
- C14L
1
@C14L 对于我返回了 [u'abc', u'\u4f60\u597d', u'def', u'\u554a'] ,你可以再检查一下吗? - minocha
仍然得到['abc你好def啊']。也许是Python 2和3之间的差异?(顺便说一句,我没有给你的回答点踩) - C14L
我正在使用Python2.7,同时list()是不必要的,因为结果返回一个列表。 - minocha
1
是的,它是 Py2 v 3。在 Python 3 中,我将 filter 对象强制转换为 list 后只会得到一个项目。在 Py2 中,就像你所说的那样,我会得到 list - C14L
显示剩余6条评论

0

什么?不,那是Python 2没错(如果你想要Python 3,http://IdeOne.com/有单独的选项),尽可能使用了可移植的语法;这个简单的脚本片段在Py3中也应该可以工作,除了`xrange()`是特定于Python 2的(在Python 3中,请使用range())。 - tripleee

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