首页Python【Python计算生态】e...

【Python计算生态】emoji——处理emoji表情符号

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

Python第三方库emoji库用于处理、解析和显示表情符号(emoji)。可以识别文本中的表情符号,并将它们转换为对应的描述性文字,或者将描述性文字转换回表情符号。

emoji库默认语言为英语(language=’en’),但也支持其他语言,如西班牙语(‘es’)、葡萄牙语(‘pt’)、意大利语(‘it’)、法语(‘fr’)、德语(‘de’)等。
emoji库可以直接使用 pip 完成安装:
pip install emoji
emoji库支持的表情符号列表可以通过以下页面查看:
https://carpedm20.github.io/emoji/
可以通过 version() 函数查找表情符号的 Unicode/Emoji 版本。后续介绍的函数会涉及到表情符号的版本问题。
emoji.version("😁")
# 输出:0.6

emoji.version(":butterfly:")
# 输出:3

02
转换表情符号

emoji库的主要目的是使用 emojize() 和 demojize() 函数对 Unicode 编码和表情符号名称进行相互转换操作。

  • emoji.emojize() 函数可以将描述性文字转换回对应的表情符号。

emoji.emojize(string, delimiters,               variant, language,               version, handle_version)
参数说明:
  • string:包含表情符号名称的字符串。
  • delimiters:(可选)使用除_DEFAULT_DELIMITER之外的分隔符。每个分隔符应至少包含一个不属于a-zA-Z0-9以及_-&.()!?#*+,的字符。
  • variant:(可选)选择变体选择器,可选值有“base”(无变体,即None),VS-15(“text_type”)VS-16(“emoji_type”)
  • language:选择表情符号名称的语言,使用语言代码,如‘es’(西班牙语)、‘de’(德语)等,或使用‘alias’来使用英文别名(除大量别名外,还支持 Unicode 联盟定义的整套表情符号代码。 默认情况下,只启用官方列表,但通过 emoji.emojize(language=’alias’),可以启用完整列表和别名)。
  • version :(可选)最大版本。如果设置为某个Emoji版本,则所有高于此版本的emoji将被忽略。
  • handle_version:(可选)替换高于指定版本的emoji,而不是忽略它们。handle_version可以是一个字符串或一个可调用的对象;如果它是一个可调用的对象,则传递给它Unicode emoji和来自EMOJI_DATA的数据字典,并且它必须返回一个用于替换的字符串。
示例代码:
print(emoji.emojize("Python is fun :thumbsup:", language='alias'))
# 输出:Python is fun 👍

print(emoji.emojize("Python is fun :thumbs_up:"))
# 输出:Python is fun 👍

print(emoji.emojize("Python is fun {thumbs_up}", delimiters = ("{""}")))
# 输出:Python is fun 👍

print(emoji.emojize("Python is fun :red_heart:", variant="text_type"))
# 输出:Python is fun ❤︎ (black heart)

print(emoji.emojize("Python is fun :red_heart:", variant="emoji_type"))
# 输出:Python is fun ❤️ (red heart)
如果要直接访问某种语言的表情符号名称,可以加载语言数据,然后使用语言代码作为键值,在 EMOJI_DATA dict 中访问这些数据:
# 访问某种语言的表情符号名称
emoji.config.load_language('en')
print(emoji.EMOJI_DATA['👍']['en'])
# 输出::thumbs_up:

  • emoji.demojize() 函数可以将表情符号转换为它们对应的描述性文字。

emoji.demojize(string, delimiters,                language, version, handle_version)

参数与emojize() 函数向相同。

示例代码:

print(emoji.emojize("Python is fun :thumbsup:", language='alias'))
# 输出:Python is fun :thumbs_up:

print(emoji.demojize("icode is tricky 😯", delimiters=("__""__")))
# 输出:icode is tricky __hushed_face__


02
提取表情符号

提取表情符号相关的函数主要包括以下几个函数(需要注意的是,一个表情符号可以跨越多个字符):

  • analyze() 函数用于查找字符串中的所有表情符号,并生成表情符号及其位置和关于表情符号的可用元信息:

emoji.analyze(string, non_emoji, join_emoji)

参数说明:

  • string :要分析的字符串;

  • non_emoji:是否返回非 emoji 字符列表,默认为 False

  • join_emoji:控制非 RGI 表情符号是作为单个标记处理,还是作为多个表情符号处理,默认为 True

该函数将返回一个生成器,生成每个表情符号及其位置和关于表情符号的可用元信息,因此需要遍历或将输出转换为列表。

其中,Token是一个已命名的元组,包含匹配字符串及其 EmojiMatch 对象(如果是表情符号或非 unicode 表情符号的单个字符)。

list(emoji.analyze('A 🧑 pilot a 🚀'))
# 输出:[Token(chars='🧑', value=EmojiMatch(🧑, 2:3)),
#       Token(chars='🚀', value=EmojiMatch(🚀, 12:13))]

# non_emoji 参数
list(emoji.analyze('A 🧑 pilot a 🚀', non_emoji=True))
# 输出:[Token(chars='A', value='A'),
#       Token(chars=' ', value=' '),
#        Token(chars='🧑', value=EmojiMatch(🧑, 2:3)),
#        Token(chars=' ', value=' '),
#        Token(chars='p', value='p'),
#        Token(chars='i', value='i'),
#        Token(chars='l', value='l'),
#        Token(chars='o', value='o'),
#        Token(chars='t', value='t'),
#        Token(chars=' ', value=' '),
#        Token(chars='a', value='a'),
#        Token(chars=' ', value=' '),
#        Token(chars='🚀', value=EmojiMatch(🚀, 12:13))]


# join_emoji 参数
list(emoji.analyze('👨‍👩🏿‍👧🏻‍👦🏾', join_emoji=False))
# 输出:[Token(chars='👨', value=EmojiMatch(👨, 0:1)),
#          Token(chars='👩🏿', value=EmojiMatch(👩🏿, 2:4)),
#          Token(chars='👧🏻', value=EmojiMatch(👧🏻, 5:7)),
#          Token(chars='👦🏾', value=EmojiMatch(👦🏾, 8:10))]

# 遍历输出并获取表情符号元信息
tokens = emoji.analyze('A 🧑 pilot a 🚀')
for token in tokens:
    print(token.value)
    print(token.value.data)
    print('---------')
# 输出:EmojiMatch(🧑, 2:3)
#      {'en': ':person:', 'status': 2, 'E': 5, 'alias': [':adult:']}
#      ---------
#      EmojiMatch(🚀, 12:13)
#      {'en': ':rocket:', 'status': 2, 'E': 0.6}
#      ---------


  • emoji_list() 函数用于查找字符串中的所有表情符号及其位置:

emoji.emoji_list(string)

该函数将以 dict 列表格式返回位置和表情符号。

emoji.emoji_list('Python is 👍')
# 输出:[{'match_start': 10, 'match_end': 11, 'emoji': '👍'}]

emoji.emoji_list('An 🧑 pilot a 🚀')
# 输出:[{'match_start': 3, 'match_end': 4, 'emoji': '🧑'},
#       {'match_start': 13, 'match_end': 14, 'emoji': '🚀'}]


  • distinct_emoji_list() 函数用于从字符串中获取不同的表情符号集:

emoji.distinct_emoji_list(string)

该函数将返回字符串中不同的表情符号列表。

emoji.distinct_emoji_list('An 🧑 pilot a 🚀')
# 输出:['🚀', '🧑']


  • emoji_count() 函数用于从字符串中获取表情符号的计数:

emoji.emoji_count(string, unique)

参数说明:

  • unique :(可选)是否只计算唯一的表情符号,默认为False

返回字符串中表情符号的计数。

emoji.emoji_count('Some emoji: 🌍, 😂, 😃, 😂, 🌍, 🌦️')
# 输出:6

emoji.emoji_count('Some emoji: 🌍, 😂, 😃, 😂, 🌍, 🌦️', unique=True)
# 输出:4


  • is_emoji() 函数检查字符串/字符是否为单个表情符号

emoji.is_emoji(string)

如果字符串是单个表情符号,且被 Unicode.org “推荐用于通用交换”,则返回 True

emoji.is_emoji('🌍')
# 输出:True

emoji.is_emoji('🌍😂')
# 输出:False

emoji.is_emoji('test')
# 输出:False


  • purely_emoji() 函数用于检查字符串是否只包含表情符号

emoji.purely_emoji(string)

如果字符串只包含表情符号,则返回 True。 

'U0001f600ufe0f'
# 输出:'😀️'

emoji.is_emoji('U0001f600ufe0f')
# 输出:False

emoji.is_emoji('U0001f600')
# 输出:True

emoji.is_emoji('ufe0f')
# 输出:False

# 检查字符串是否只包含表情符号
emoji.purely_emoji('U0001f600ufe0f')
# 输出:True


03
替换或删除表情符号

replace_emoji() 函数用于使用自定义字符串替换 Unicode 表情符号。

emoji.replace_emoji(string, replace, version)

参数说明:

  • string:包含 Unicode 字符的字符串;

  •  replace:(可选)replace 可以是字符串,也可以是可调用的字符串;如果是可调用的字符串,它将从 EMOJI_DATA 传递 Unicode emoji 和数据 dict,并必须返回一个替换字符串 ;

  • version:(可选)最大版本。 如果设置为 Emoji 版本,则只有该版本以上的 emoji 才会被替换。

示例代码:

emoji.replace_emoji('Python is 👍', replace='')
# 输出:'Python is '

emoji.replace_emoji('Python is 👍', replace='👎')
# 输出:'Python is 👎'


更多内容可以前往官方文档查看:

https://carpedm20.github.io/emoji/docs/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments