Python3正则表达式:保留一些表情符号,丢弃其余表情

时间:2019-03-13 00:04:12

标签: regex python-3.x emoji regex-negation python-unicode

菜鸟在这里。我有一些字符串,我想保留一些表情符号并丢弃其余的表情。

输入:

这本书太有趣了❤️。这本书是炸弹(最佳影片) 我喜欢它!我绝对推荐它!'

期望的输出:

这本书太有趣了❤️。这本书是炸弹(最佳影片) 我喜欢它!我绝对推荐它!'

我有符合以下条件的re.compile:

我不知道如何在re.compile中将其组合在一起,从而将一个彼此排斥。或者,保留字母数字,标点符号和我的表情符号,然后将其余部分替换为“”。

mytext = This book is so funny❤️. This book  is the bomb(AS IN THE BEST 
IN THE WORLD   )I love    it!I definitely recommend it!'
# Desired out put:
# u'This book is so funny❤️. This book is the bomb(AS IN THE BEST 
IN THE WORLD )I love    it!I definitely recommend it!'
print ("Original text:")
print (mytext, "\n")

# Strip out emoticon modifiers, leaving a simplified emoticon to work with.
# https://en.wikipedia.org/wiki/Variation_Selectors_(Unicode_block)
# https://en.wikipedia.org/wiki/Variation_Selectors_Supplement
Emoji_Modifiers = re.compile(u'([\U0000FE00-\U0000FE0F])|([\U000E0100-\U000E0100])')
mytext_mod_gone = Emoji_Modifiers.sub(r'', mytext) 
print ("Modifiers Removed:")
print (mytext_mod_gone, "\n")

# All emoticons    
find_regex      = re.compile(u'([\U00002600-\U000027BF])|([\U0001f300-\U0001f64F])|([\U0001f680-\U0001f6FF])')
# Heart emoticons
#find_regex     = re.compile(u"([\U00002619])|([\U00002661])|([\U00002665])|([\U00002763])|([\U00002764])|([\U00002765])|([\U00002766])|([\U00002767])|([\U00002E96])|([\U00002E97])|([\U00002F3C])|([\U0001F394])|([\U0001F48C])|([\U0001F48F])|([\U0001F491])|([\U0001F493])|([\U0001F494])|([\U0001F495])|([\U0001F496])|([\U0001F497])|([\U0001F498])|([\U0001F499])|([\U0001F49A])|([\U0001F49B])|([\U0001F49C])|([\U0001F49D])|([\U0001F49E])|([\U0001F49F])|([\U0001F4D6])|([\U0001F5A4])|([\U0001F60D])|([\U0001F618])|([\U0001F63B])|([\U0001F970])|([\U0001F9E1])")
# Alphanumeric + punctuation for an alternative solution
#find_regex     = re.compile(r"[^a-zA-Z0-9!,.?!#&'()*+,-./:;<=>?@\^_`{|}~\s]") # 

mytext_emoji_gone = find_regex.sub(r'', mytext)

我跌倒在:

  • (?<!...)后加上负向否定Unicode。我不太了解操作数,regex101.com仅适用于r',不适用于u'。
  • 在重新编译中将多个正则表达式组合在一起。假设我想保留字母数字和表情符号,那么当我re.compile(u'(\Uxxxx)' | r'(regex)' )时会抱怨。 |:'str'和'str'不支持的操作数类型,因此OR类型语句在这里不起作用...并且OR给出不希望的结果。

我可以在这两个方面寻求帮助吗?

  • 忽略一部分表情符号,然后删除其余的表情符号(我的首选解决方案)
  • 保留(字母数字,标点符号和我的表情符号),并删除其余部分。
  • 一个具体问题:您可以“堆叠”重新编译吗? IE创建2个不同的re.compile来匹配(或不匹配)事物,然后将它们结合在一起。

2 个答案:

答案 0 :(得分:1)

regex101具有Unicode选项,它是一个标志,您可以从regex框的右侧打开它。

我认为最简单的方法是找到字符串中除要保留的表情符号以外的所有表情符号,然后像您想要的那样用空字符串替换它们。为此,您可以使用可找到任何表情符号的正则表达式(在此示例中,我将使用[\U00010000-\U0010ffff],但我敢肯定有更好的表情符号,因此请使用其中之一),并在其中添加否定的外观忽略您要保留的表情符号。

结局正则表达式应类似于this

(?![\u2764])[\U00010000-\U0010ffff]

第一部分(?![\u2764])将确保比赛不是您想要保留的表情符号,第二部分[\U00010000-\U0010ffff]将确保比赛是表情符号

您可以将所有希望保留的其他表情符号添加到方括号(?![\u2764中  这里])

答案 1 :(得分:1)

我去了:

find_regex     = re.compile(u"(?![\U00002619])(?![\U00002661])(?![\U00002665])(?![\U00002763])(?![\U00002764])(?![\U00002765])(?![\U00002766])(?![\U00002767])(?![\U00002E96])(?![\U00002E97])(?![\U00002F3C])(?![\U0001F394])(?![\U0001F48C])(?![\U0001F48F])(?![\U0001F491])(?![\U0001F493])(?![\U0001F494])(?![\U0001F495])(?![\U0001F496])(?![\U0001F497])(?![\U0001F498])(?![\U0001F499])(?![\U0001F49A])(?![\U0001F49B])(?![\U0001F49C])(?![\U0001F49D])(?![\U0001F49E])(?![\U0001F49F])(?![\U0001F4D6])(?![\U0001F5A4])(?![\U0001F60D])(?![\U0001F618])(?![\U0001F63B])(?![\U0001F970])(?![\U0001F9E1])"r"[^a-zA-Z0-9!,.?!#&'()*+,-./:;<=>?@\^_`{|}~\s]")

mytext_emoji_gone = find_regex.sub(r'', mytext)

去除了所有其他表情符号,只剩下心脏和书本表情符号,以及字母数字和标点符号。

作为我最初的问题的一部分,有没有办法堆叠这些?当前,这是一长行代码。我们可以做类似的事情吗?

regex = re.compile(a)
regex += re.compile(b)

那将使用房地产,但是我可以接受