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

如何在Python中正确迭代unicode字符,python,unicode,python-unicode,Python,Unicode,Python Unicode,我想迭代一个字符串并输出所有表情 我试图迭代这些字符,并根据一个 然而,python似乎将unicode字符分割成更小的字符,破坏了我的代码。例如: >>> list(u'Test \U0001f60d') [u'T', u'e', u's', u't', u' ', u'\ud83d', u'\ude0d'] 知道为什么u'\U0001f60d'被拆分了吗 或者,有什么更好的方法来提取所有表情符号?这是我最初的提取代码: def get_emojis(text): em

我想迭代一个字符串并输出所有表情

我试图迭代这些字符,并根据一个

然而,python似乎将unicode字符分割成更小的字符,破坏了我的代码。例如:

>>> list(u'Test \U0001f60d')
[u'T', u'e', u's', u't', u' ', u'\ud83d', u'\ude0d']
知道为什么u'\U0001f60d'被拆分了吗

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

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

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

regex
r'[^\w\s,]
匹配任何非单词、空格或逗号的字符。

Python pre-3.3在内部使用UTF-16LE(窄版)或UTF-32LE(宽版)存储Unicode,并向用户公开此详细信息。UTF-16LE用于将U+FFFF以上的Unicode字符表示为两个代码点。使用广泛的Python构建或切换到Python 3.3或更高版本来修复此问题

处理窄构建的一种方法是匹配代理项对:

Python 2.7(窄版本):

Python 3.6:

>s='Test\U0001f60d'
>>>莱恩(s)
6.
>>>名单

我无法在Python2.7或Python2.6上复制它(而且我手头没有旧版本)。当我查看
列表(u'Test\U0001f60d')
时,我得到
[u'T',u'e',u's',u'T',u'\U0001f60d']
。您使用的是哪一版本的Python?这是unicode字符的宽度。这应该在python3.3+中得到修复,在python3.3+中,内部表示形式也可以翻转循环并在表情符号上迭代,而不是将表情符号拆分为两个字符的原始字符串:
>>re.findall(r'[^\w\s,]',u'Test U0001f60d')
[u'\ud83d',u'\ude0d']
>>> 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']