【问题标题】:Split a string of Emojis into single Emoji character将一串表情符号拆分为单个表情符号字符
【发布时间】:2016-01-12 20:55:25
【问题描述】:

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

我想获取一个数组或列表,其中每个表情符号作为一个元素,例如[????,????,????????,????????]

然而,问题在于表情符号的长度各不相同。所以len(u'????')1,而len(u'????????')是2。

那么我将如何拆分我的DATA?我已经看到它是用 JavaScript 完成的,但无法找到用 Python 完成它的方法 (How can I split a string containing emoji into an array?)。

【问题讨论】:

  • @EugeneSoldatov 我以前也看到过这个问题,但它实际上只显示了如何正确计算表情符号的数量。
  • 只是不使用 len() 函数:re.findall(u'[\U0001f600-\U0001f650]', s)
  • 那行不通。表情符号??????例如实际上是????和????的组合。所以re.findall 的结果是 ['????', '????'] 而不是 ['????????']。
  • 第 3 方 regex 模块可以使用 Unicode 代码点类别进行搜索,因此您可以将表情符号及其修饰符与正确的表达式保持在一起。但是,您示例中的代码点是在 Unicode 8.0 中定义的,并且也需要 Python 3.5。

标签: python regex split emoji


【解决方案1】:

使用第 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']

可能还有其他例外。

【讨论】:

  • 几乎可以工作!不知道为什么,但标志表情符号有点不同。你知道他们是否支持吗? s (\U0001f1e6\U0001f1ee) 中的最后一个 unicodes 应该是一个表情符号,即??。 unicode 8.0 还不支持标志吗?
  • 好的,我刚刚读到标志是两个区域指标符号的组合,范围在 U+1F1E6U+1F1FF 之间。那么最简单的方法可能是遍历结果列表并查找范围?
  • 好答案。但是,我发现 \X 似乎匹配常规 ascii 和其他字符(几乎所有字符)?这使得表情符号检测效果降低。
  • @Xerion \X 匹配字素簇,其中也包括单个代码点。如果你想要特定的字符,你仍然需要搜索代码点范围。
【解决方案2】:

如果您想要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 列表推导,代码更短,但行为应该相同。也就是说,我还没有完全测试上面的代码。至少它应该让你指向正确的方向。

【讨论】:

  • 此解决方案仅适用于 Python 的窄版本。如果你真的想处理表情符号和其他东西,你至少应该使用 Python 3.3。它也没有处理??的情况
猜你喜欢
  • 2020-04-06
  • 2021-06-09
  • 2019-03-02
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多