将一串Emojis拆分为单个表情符号字符

时间:2015-10-14 16:36:06

标签: python regex split emoji

假设我有以下字符串:DATA = ""

我希望得到一个数组或列表,每个表情符号都是一个元素,就像[,,,]一样。

然而,问题在于表情符号的长度各不相同。因此len(u'')1,而len(u'')为2。

那么我如何分割我的DATA?我已经看到它是在JavaScript中完成的,但无法通过Python找到一种方法(How can I split a string containing emoji into an array?)。

2 个答案:

答案 0 :(得分:3)

使用第三方regex模块(pip install regex)和Python 3.5:

>>> import regex
>>> s = '\U0001f680\U0001f618\U0001f44d\U0001f3fe\U0001f1e6\U0001f1ee'
>>> import unicodedata as ud
>>> ud.category(s[0])
'So'
>>> ud.category(s[1])
'So'
>>> ud.category(s[2])
'So'
>>> ud.category(s[3])
'Sk'
>>> ud.category(s[4])
'So'
>>> ud.category(s[5])
'So'
>>> regex.findall(r'\p{So}\p{Sk}*',s)
['\U0001f680', '\U0001f618', '\U0001f44d\U0001f3fe', '\U0001f1e6', '\U0001f1ee']

编辑:

国旗是U + 1F1E6 - U + 1F1FF范围内的双字母区域指示符号。结果regex有一个字形集群\X开关,但它找到了标志而不是肤色标记。

>>> regex.findall(r'\X',s)
['\U0001f680', '\U0001f618', '\U0001f44d', '\U0001f3fe', '\U0001f1e6\U0001f1ee']

但是,您可以查找符号修饰符或字形聚类:

>>> regex.findall(r'.\p{Sk}+|\X',s)
['\U0001f680', '\U0001f618', '\U0001f44d\U0001f3fe', '\U0001f1e6\U0001f1ee']

可能还有其他例外。

答案 1 :(得分:0)

如果你想在How can I split a string containing emoji into an array?中使用Python版本的JavaScript解决方案,那么这应该可以解决问题:

import re

pattern = re.compile(r'([\uD800-\uDBFF][\uDC00-\uDFFF])')

def emojiString2List(text):
    return list(x for x in pattern.split(text) if x != '')

请注意,Python的str.split()方法不接受正则表达式(而JS' s),因此您必须使用re库来使用正则表达式进行拆分。此外,通过使用Python列表理解,代码要短得多,但行为应该相同。也就是说,我还没有完全测试上面的代码。至少它应该让你指向正确的方向。