将一串表情符号拆分为单个表情符号字符
Split a string of Emojis into single Emoji character
假设我有以下字符串:DATA = ""
.
我想得到一个数组或列表,其中每个表情符号都是一个元素,就像这样[,,,]
。
然而,问题在于表情符号的长度各不相同。所以 len(u'')
是 1
,而 len(u'')
是 2.
那么我该如何拆分我的 DATA
?我已经在 JavaScript 中看到它已经完成,但无法在 Python 中找到实现它的方法 (How can I split a string containing emoji into an array?)。
如果您想要 How can I split a string containing emoji into an array? 中 JavaScript 解决方案的 Python 版本,那么这应该可以解决问题:
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 接受),因此您必须使用 re
库来使用正则表达式进行拆分。此外,通过使用 Python 列表理解,代码更短,但行为应该是相同的。也就是说,我还没有完全测试上面的代码。至少它应该让你指向正确的方向。
使用第 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']
可能还有其他例外。
假设我有以下字符串:DATA = ""
.
我想得到一个数组或列表,其中每个表情符号都是一个元素,就像这样[,,,]
。
然而,问题在于表情符号的长度各不相同。所以 len(u'')
是 1
,而 len(u'')
是 2.
那么我该如何拆分我的 DATA
?我已经在 JavaScript 中看到它已经完成,但无法在 Python 中找到实现它的方法 (How can I split a string containing emoji into an array?)。
如果您想要 How can I split a string containing emoji into an array? 中 JavaScript 解决方案的 Python 版本,那么这应该可以解决问题:
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 接受),因此您必须使用 re
库来使用正则表达式进行拆分。此外,通过使用 Python 列表理解,代码更短,但行为应该是相同的。也就是说,我还没有完全测试上面的代码。至少它应该让你指向正确的方向。
使用第 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']
可能还有其他例外。