如何从Python中的字符串中提取表情包和标志?字符串、标志、表情、Python

2023-09-04 22:49:04 作者:我爱的王冷静他不冷静i

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

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

推荐答案

这里有一篇关于Unicode encodes country flags的文章。它们被表示为两个regional indicator symbols(码位范围从U+1F1E6到U+1F1FF)的序列,尽管显然不是两个符号的每一个可能的组合都对应于一个国家(因此也对应于一个国旗)。您可以假设不会出现"坏"组合,或者维护(或导入)具有(当前)270个有效符号对的集合。

如何截取python字符串内容

然后是地区旗帜。它们被表示为一个黑色标志代码点(U+1F3F4),后跟一系列拼写区域标识符的tags(代码点U+E0001,范围从U+E0020到U+E007F)(例如,对于flag or Wales将是"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(使用骷髅和交叉骨骼表情符号,而不是文本)"。

现在,有不同的方法可以处理这一切,但在您当前的方法中,您一次迭代一个代码点,因此您将无法检测到复杂的表情符号。你可以只拥有一大组所有有趣的序列(旗帜、一些复合表情符号等)。并在输入中查找它们。您可以检查当前字符是否是区域指示器符号,如果是,则尝试读取下一个代码点以形成标志(并满足于使用单独的简单表情符号)。我不确定什么是最适合你的解决方案(就复杂性/利益权衡而言),但你应该意识到表情符号编码的细微差别和你可能会发现的陷阱。