假设我有以下字符串:DATA = ""
。
我希望得到一个数组或列表,每个表情符号都是一个元素,就像[,,,]
一样。
然而,问题在于表情符号的长度各不相同。因此len(u'')
为1
,而len(u'')
为2。
那么我如何分割我的DATA
?我已经看到它是在JavaScript中完成的,但无法通过Python找到一种方法(How can I split a string containing emoji into an array?)。
答案 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列表理解,代码要短得多,但行为应该相同。也就是说,我还没有完全测试上面的代码。至少它应该让你指向正确的方向。