从字符串中提取所有Emojis并忽略Python中的Fitzpatrick修饰符(肤色等)

时间:2018-01-19 11:59:06

标签: python unicode utf-8 emoji

我最近遇到了一个问题,我需要在字符串中提取所有Emojis来计算特定Emojis的出现次数。 Emoji python package让我提取所有的Emojis,但我总是得到特定的修饰符,例如作为单独的Emojis提取的肤色。我想忽略肤色和其他Fitzpatrick修饰符Variant Selectors(请参阅this page for typesbackground on Fitzpatrick from Wikpedia)。以下代码将选择Fitzpatrick修饰符作为单独的表情符号(这不是我需要的):

import emoji
def extract_emojis(str):
  return list(c for c in str if c in emoji.UNICODE_EMOJI)

示例:此表情符号❤️实际上由两部分组成,一个心脏(Unicode代码点:U+2764)和一个红色修饰符(Unicode代码点:U+fe0f)。 print(repr('❤️'))导致:\u2764\ufe0f - 两个单独的unicodes,但只有一个表情符号。单独的第二个代码点本身没有意义,但它在return list(c for c in str if c in emoji.UNICODE_EMOJI)的列表中作为单独的表情符号返回。

1 个答案:

答案 0 :(得分:1)

这是一个忽略肤色和其他修饰符的解决方案,并将所有这些表情符号变体视为一个表情符号。来自Martijn Pieters的answer帮助我解决了以下问题:

import emoji
import unicodedata

def checkEmojiType(strEmo):
    if unicodedata.name(strEmo).startswith("EMOJI MODIFIER"):
        return False
    else:
        return True
def extract_emojis(str):
    return list(c for c in str if c in emoji.UNICODE_EMOJI and checkEmojiType(c))

[编辑] 但是......目前,上面的解决方案似乎不支持Zero-Width Joiners(见下面的评论)。您可以使用以下代码自行测试:

n = '‍⚕️' #copy the medical emoji with zero-width joiner (http://www.unicode.org/emoji/charts/emoji-zwj-sequences.html). This should only fall back to a double-emoji if not otherwise available
#extract all emojis with the function from above
nlist = def_functions.extract_emojis(n)
for xstr in nlist:
    #print codepoints
    print('Emoji Extract: U+%04x' % ord(xstr))
for _c in n:
    #print all Unicode Codepoints directly
    print('Each Codepoint: U+%04x' % ord(_c))

这是输出:

EmojiExtract: U+1f468
EmojiExtract: U+2695
Each Codepoint: U+1f468
Each Codepoint: U+200d
Each Codepoint: U+2695
Each Codepoint: U+fe0f
表情符号提取物没有加入两个Emojis(可能会以某种方式预期)。