热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从多语言Unicode文本中删除表情符号

如何解决《从多语言Unicode文本中删除表情符号》经验,为你挑选了1个好方法。

我正在尝试从Unicode文本中删除表情符号。我尝试了另一种Stack Overflow帖子中介绍的各种方法,但是这些方法都没有完全删除所有表情符号/笑脸。例如:

解决方案1:

def remove_emoji(self, string):
    emoji_pattern = re.compile("["
                           u"\U0001F600-\U0001F64F"  # emoticons
                           u"\U0001F300-\U0001F5FF"  # symbols & pictographs
                           u"\U0001F680-\U0001F6FF"  # transport & map symbols
                           u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                           u"\U00002702-\U000027B0"
                           u"\U000024C2-\U0001F251"
                           "]+", flags=re.UNICODE)
    return emoji_pattern.sub(r'', string)

在以下示例中进入:

Input: ??????? ????? ??????? 
Output: ??????? ????? ??????? 

另一个尝试,解决方案2:

def deEmojify(self, inputString):
    returnString = ""
    for character in inputString:
        try:
            character.encode("ascii")
            returnString += character
        except UnicodeEncodeError:
            returnString += ''
    return returnString

导致删除任何非英文字符:

 Input: Test????? ??????? A.P&T.S. 
 Output: Test  A.P&T.S. 

它不仅删除了所有表情符号,而且还删除了非英文字符character.encode("ascii");我的非英语输入无法编码为ASCII。

有什么方法可以从国际Unicode文本中正确删除Emoji吗?



1> Martijn Piet..:

正则表达式已过时。它似乎涵盖了Emoji定义的Unicode 8.0之前的版本(因为Unicode 9.0中添加了U + 1F91D HANDSHAKE)。另一种方法只是强制编码为ASCII的效率非常低下的方法,而只是删除Emoji时,这几乎不是您想要的(并且可以使用更加轻松,高效地实现text.encode('ascii', 'ignore').decode('ascii'))。

如果您需要最新的正则表达式,请从积极尝试使Emoji保持最新状态的软件包中获取一个;它特别支持生成这样的正则表达式:

import emoji

def remove_emoji(text):
    return emoji.get_emoji_regexp().sub(u'', text)

该软件包当前是Unicode 11.0的最新版本,并具有可以快速更新到将来发行版的基础结构。您的项目要做的就是在有新版本时进行升级。

使用示例输入进行演示:

>>> print(remove_emoji(u'??????? ????? ??????? '))
??????? ????? ??????? 
>>> print(remove_emoji(u'Test????? ??????? A.P&T.S. '))
Test????? ??????? A.P&T.S. 

需要注意的是在正则表达式的作品Unicode文本,为Python 2请确保您有从解码strunicode,为Python 3,bytesstr 第一

表情符号这些天是复杂的野兽。以上内容将删除完整的有效表情符号。如果您有“不完整”的Emoji表情组件,例如肤色代码点(仅希望与特定的 Emoji表情结合使用),则在删除这些表情符时会遇到更多麻烦。肤色代码点很容易(之后只删除这5个代码点),但是有很多组合由无辜的字符组成,例如?。U + 2640女性符号或?U + 2642 MALE SIGN以及变体选择器和U + 200D零宽度JOINER在其他情况下也具有特定含义,并且您不能只对它们进行正则表达式,除非您不介意使用Devanagari,Kannada或CJK表意文字打断文本,仅举几个例子。

也就是说,以下Unicode 11.0代码点可能可以安全地删除(基于过滤Emoji_ComponentEmoji-data名称):

20E3          ;  (?)     combining enclosing keycap
FE0F          ; ()        VARIATION SELECTOR-16
1F1E6..1F1FF  ; (..)  regional indicator symbol letter a..regional indicator symbol letter z
1F3FB..1F3FF  ; (..)  light skin tone..dark skin tone
1F9B0..1F9B3  ; (..) red-haired..white-haired
E0020..E007F  ; (..)      tag space..cancel tag

可以通过创建一个新的正则表达式来匹配它们来删除它:

import re
try:
    uchr = unichr  # Python 2
    import sys
    if sys.maxunicode == 0xffff:
        # narrow build, define alternative unichr encoding to surrogate pairs
        # as unichr(sys.maxunicode + 1) fails.
        def uchr(codepoint):
            return (
                unichr(codepoint) if codepoint <= sys.maxunicode else
                unichr(codepoint - 0x010000 >> 10 | 0xD800) +
                unichr(codepoint & 0x3FF | 0xDC00)
            )
except NameError:
    uchr = chr  # Python 3

# Unicode 11.0 Emoji Component map (deemed safe to remove)
_removable_emoji_compOnents= (
    (0x20E3, 0xFE0F),             # combining enclosing keycap, VARIATION SELECTOR-16
    range(0x1F1E6, 0x1F1FF + 1),  # regional indicator symbol letter a..regional indicator symbol letter z
    range(0x1F3FB, 0x1F3FF + 1),  # light skin tone..dark skin tone
    range(0x1F9B0, 0x1F9B3 + 1),  # red-haired..white-haired
    range(0xE0020, 0xE007F + 1),  # tag space..cancel tag
)
emoji_compOnents= re.compile(u'({})'.format(u'|'.join([
    re.escape(uchr(c)) for r in _removable_emoji_components for c in r])),
    flags=re.UNICODE)

然后更新上面的remove_emoji()函数以使用它:

def remove_emoji(text, remove_compOnents=False):
    cleaned = emoji.get_emoji_regexp().sub(u'', text)
    if remove_components:
        cleaned = emoji_components.sub(u'', cleaned)
    return cleaned


@ascii_walker:是的,我假设使用Python 3(Python 2.7非常接近生命终结,您应该真正考虑升级!)。正则表达式针对Unicode文本,因为UTF-8序列打开了另一批巨大的蠕虫,所以正则表达式中处理了表情符号。我今天不去那里。
推荐阅读
  • 1关于字符串相邻的两个或多个字符串字面值(引号引起来的字符)将会自动连接到一起:str_catpython!str_cat输出:python!把很长 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • java io换行符_Java IO:为什么从stdin读取时,换行符的数字表示出现在控制台上?...
    只是为了更好地理解我在讲座中听到的内容(关于Java输入和输出流),我自己做了这个小程序:publicstaticvoidmain(String[]args)thro ... [详细]
  • javaftp上传,javaftp下载文件
    本文目录一览:1、javaftp上传5G以上大文件,怎么做 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 查找给定字符串的所有不同回文子字符串原文:https://www ... [详细]
  • 点此学习更多SQL相关函数与字符串处理函数mysql函数一、简明总结ASCII(char)        返回字符的ASCII码值BIT_LENGTH(str)      返回字 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 深入理解计算机系统之链接(一)
    程序是怎样运行的写好的c程序怎样运行的呢?答案是一个写好的程序要先经过语言预处理器,编译器,汇编器和链接器生成最后的可执行文件,然后加载器将可执行文件加载到内存中才能运行。这里以一 ... [详细]
author-avatar
百度地震姜常宏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有