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

Python 将表情符号字符串拆分为单个表情符号字符,python,regex,split,emoji,Python,Regex,Split,Emoji,假设我有以下字符串:DATA=“如果您希望在中使用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()方法不接受正则表达式

假设我有以下字符串:
DATA=“如果您希望在中使用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则接受),因此您必须使用
re
库使用正则表达式进行拆分。此外,通过使用Python列表理解,代码要短得多,但行为应该相同。也就是说,我还没有完全测试上述代码。至少它应该让您指向正确的方向。

使用第三方
regex
模块(
pip安装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']

可能还有其他例外。

可能重复@EugeneSoldatov的问题我以前也见过,但实际上它只显示了如何正确计算表情符号的数量。只是不要使用len()函数:re.findall(u'[\U0001f600-\U0001f650]',s)但这不起作用。第三方的emoji
regex
模块可以使用Unicode代码点类别进行搜索,因此您可以将emoji及其修饰符与正确的表达式放在一起。但是,您的示例中的代码点是在Unicode 8.0中定义的,也需要Python 3.5。此解决方案仅适用于狭窄的内部版本f Python。如果你真的想处理表情符号和其他东西,你应该至少使用Python 3.3。它也不考虑几乎可以正常工作的情况!不知道为什么,但标志表情符号有点不同。你知道它们是否受支持吗?最后一个是你的
s
\U0001f1e6\u0001ee
)应该是一个表情符号,即Ok,我刚读到标志是两个区域指示符号的组合,范围在
U+1F1E6
U+1F1FF
之间。所以最简单的方法可能是查看结果列表并查找范围?答案很好。但是,我发现\X似乎与常规ascii和其他字符匹配(几乎都是字符)?这使得表情符号检测效率降低。@Xeron\X与grapheme群集相匹配,grapheme群集也包括单个代码点。如果需要特定字符,则仍然需要搜索代码点范围。