【问题标题】:How to extract emojis and flags from strings in Python?如何从 Python 中的字符串中提取表情符号和标志?
【发布时间】:2018-08-22 22:29:51
【问题描述】:
import emoji

def emoji_lis(string):
_entities = []
for pos,c in enumerate(string):
    if c in emoji.UNICODE_EMOJI:
        print("Matched!!", c ,c.encode('ascii',"backslashreplace"))
        _entities.append({
            "location":pos,
            "emoji": c
            })
return _entities

emoji_lis("???????? مدیحہ????????  así, se ???? ds ????????")
  • 匹配!! ??? \U0001f467
  • 匹配!! ??? \U0001f3ff
  • 匹配!! ??? \U0001f60c
  • 匹配!! ??? \U0001f495
  • 匹配!! ??? \U0001f46d

我的代码适用于所有其他表情符号,但我如何检测国家标志?????????

【问题讨论】:

    标签: python string emoji data-cleaning


    【解决方案1】:

    我认为任何地方都没有图书馆可以做到这一点。但是,这可以通过一个函数来完成:

    \U0001F1E6\U0001F1E8 是第一个 unicode 标志,\U0001F1FF\U0001F1FC 是最后一个,因此几乎涵盖了所有这些标志。 Theres 3 more 会导致一些问题。

    这是一个检查输入是否为标志的函数:

    def is_flag_emoji(c):
        return "\U0001F1E6\U0001F1E8" <= c <= "\U0001F1FF\U0001F1FC" or c in ["\U0001F3F4\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", "\U0001F3F4\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", "\U0001F3F4\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f"]
    

    测试:

    >>> is_flag_emoji('a')
    False
    >>> is_flag_emoji('?')
    False
    >>> is_flag_emoji("""??""")
    True
    

    因此您可以相应地将您的 if 语句更改为 if c in emoji.UNICODE_EMOJI or is_flag_emoji(c):

    这有一个问题;由于许多标志是通过连接多个字符制成的,因此您可能无法识别表情符号。

    >>> s
    '?? here is more text ?? and more'
    >>>emoji_lis(s)
    Matched!! ? b'\\U0001f1fe'
    Matched!! ? b'\\U0001f1ea'
    Matched!! ? b'\\U0001f1e9'
    [{'location': 0, 'emoji': '?'}, {'location': 1, 'emoji': '?'}, {'location': 22, 'emoji': '?'}]
    

    【讨论】:

      【解决方案2】:

      这是一篇关于如何Unicode encodes country flags 的文章。它们被表示为两个regional indicator symbols 的序列(代码点范围从 U+1F1E6 到 U+1F1FF),尽管显然不是两个符号的每个可能组合都对应于一个国家(因此是一个标志)。您可以假设不会发生“错误”组合,或者维护(或导入)具有(当前)270 对有效符号对的集合。

      然后是区旗。它们表示为一个黑旗代码点 (U+1F3F4),后跟一系列 tags(代码点 U+E0001,范围从 U+E0020 到 U+E007F)拼写区域标识符(例如,对于 @ 987654324@ 这将是“gbwls”),加上一个“取消标签”代码点(U+E007F)。

      而且,除此之外,您当然还有看起来像旗帜的常规表情符号。前面提到的black flag (U+1F3F4) 就是其中之一,但你也有triangular flag (U+1F6A9) 等。其中大部分你应该已经能够检测到,因为它们就像其他表情符号一样。 然而,我们还没有完成。您遇到了复合表情符号的问题,它会影响一些标志,但也会影响许多其他表情符号。在您的示例中,您可以看到输入字符串中与黑人女性匹配的表情符号是“基本”女性表情符号,然后是这个棕色补丁。这是因为black woman emoji 由两个代码点woman (U+1F469)dark skin tone (U+1F311) 组成。在许多其他情况下,您将需要两个代码点,加上两者之间的zero-width joiner (U+200D),以指定您希望它们合并。有时您还需要输入variation selector (typically 16, U+FE0F) 以表明您希望将事物用作表情符号。您可以阅读更多关于此in this article 的信息。在标志的情况下,您有例如rainbow flag (U+1F3F3, U+FE0F,‍ U+200D, U+1F308),它将读取“白旗,变体选择器 16(使用白旗表情符号,而不是文本),零宽度连接器,彩虹”;或pirate flag (U+1F3F4,‍ U+200D, U+2620, U+FE0F),将显示“黑旗、零宽度连接器、骷髅和交叉骨、变体选择器 16(使用骷髅和交叉骨表情符号,而不是文本)”。

      现在,您可以采用不同的方法来处理所有这些问题,但在您当前的方法中,您一次迭代一个代码点,因此您将无法检测到复杂的表情符号。您可以拥有一大组所有有趣的序列(标志、一些复合表情符号等)并在输入中查找它们。您可以检查当前字符是否是区域指示符号,如果是这种情况,请尝试读取下一个代码点以形成标志(其余部分使用单个简单的表情符号)。我不确定什么是您的情况的最佳解决方案(在复杂性/利益权衡方面),但您应该了解表情符号编码的细微差别以及您可能发现的陷阱。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-13
        • 2021-09-21
        • 1970-01-01
        • 2017-12-31
        • 2016-05-26
        • 2022-06-22
        • 2014-04-06
        • 1970-01-01
        相关资源
        最近更新 更多