如何在Python中正确迭代unicode字符

时间:2017-10-12 14:13:38

标签: python unicode python-unicode

我想迭代一个字符串并输出所有的emojis。

我正在尝试迭代字符,并针对emoji list检查它们。

然而,python似乎将unicode字符拆分为较小的字符,破坏了我的代码。例如:

>>> list(u'Test \U0001f60d')
[u'T', u'e', u's', u't', u' ', u'\ud83d', u'\ude0d']

为什么你'U0001f60d'会分裂?

或者什么是提取所有表情符号的更好方法?这是我原来的提取代码:

def get_emojis(text):
  emojis = []
  for character in text:
    if character in EMOJI_SET:
      emojis.append(character)
  return emojis

3 个答案:

答案 0 :(得分:4)

Python 3.3之前的内部使用UTF-16LE(窄版本)或UTF-32LE(宽版本)来存储Unicode,并且由于leaky abstraction向用户公开了这个细节。 UTF-16LE使用surrogate pairs将U + FFFF上方的Unicode字符表示为两个代码点。使用广泛的Python构建或切换到Python 3.3或更高版本来解决问题。

处理狭义构建的一种方法是匹配代理对:

Python 2.7(窄版本):

>>> s = u'Test \U0001f60d'
>>> len(s)
7
>>> re.findall(u'(?:[\ud800-\udbff][\udc00-\udfff])|.',s)
[u'T', u'e', u's', u't', u' ', u'\U0001f60d']

Python 3.6:

>>> s = 'Test \U0001f60d'
>>> len(s)
6
>>> list(s)
['T', 'e', 's', 't', ' ', '']

答案 1 :(得分:0)

试试这个,

import re
re.findall(r'[^\w\s,]', my_list[0])

正则表达式r'[^\w\s,]'匹配任何不是单词,空格或逗号的字符。

答案 2 :(得分:-1)

问题如上所述。解决它的可能行动描述了here