关于python 3.x:Python3正则表达式:保留一些Emojis,丢弃其余的

Python3 regex: Keep some Emojis, discard the rest

这里的菜。有。我在想让这两个emoji and discard休息。

输入:

这本书是如此的有趣吗????????。这本书吗??是炸弹(AS的最佳 在世界????????????????????????????????????)的法律??????????????????????????????它!当然,在recommend它!"

desired输出:

这本书是如此的有趣吗????????。本书是炸弹(AS的最佳 在世界)的法律??????????????????????????????它!当然,在recommend它!"

在我的re.compile配合:

  • 我的emoji
  • 从全emoji解释…………………看到大卫mabodo答案

我不知道如何把它在一起re.compile excludes是一个从其他。alternatively保持alphanumeric,标点符号,和我的emoji代用品,鸭的人。"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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,"
")

# 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,"
")

# 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)

我降下:

  • negating Unicode和一个负(?追溯。我不明白《operands足够好,regex101.com只读和厂用的,不是你的。
  • 混合在一起,在一个多re.compile正则表达式。我说,如果我想让我的alphanumeric emoji投诉的时候,它re.compile(u'(\Uxxxx)' | r'(regex)' )死。unsupported操作数的类型(S)|:"STR"和"STR",所以A型或陈述不安或在这里工作和undesired给出的结果。

可能我有一些帮助:或者…

  • ignoring A subset of表情符号和deleting休息(我的首选解决方案)
  • (alphanumeric保鲜,标点符号,和我的表情),和deleting休息。
  • 一个特定的问题:"你的re.compiles堆?2 IU创建两个不同的re.compiles匹配(或不匹配)的东西,然后和他们在一起。

  • 实际上,您使用了一个错误的regex来匹配emojis,您匹配了很多其他东西,而不仅仅是emojis,并且您错过了许多包含超过2个字节的emojis。在使用python 3.x时,应该放弃u前缀,默认情况下,所有字符串都是utf8字符串。为了解决这个问题,使用一个负面的展望
  • 见regex101.com/r/rwtlgf/1,'(?![\U00002619\U00002661\U00002665\U00002763\U00002764\U000‌​02765\U00002766\U000‌​02767\U00002E96\U000‌​02E97\U00002F3C\U000‌​1F394\U0001F48C\U000‌​1F48F\U0001F491\U000‌​1F493\U0001F494\U000‌​1F495\U0001F496\U000‌​1F497\U0001F498\U000‌​1F499\U0001F49A\U000‌​1F49B\U0001F49C\U000‌​1F49D\U0001F49E\U000‌​1F49F\U0001F4D6\U000‌​1F5A4\U0001F60D\U000‌​1F618\U0001F63B\U000‌​1F970\U0001F9E1])[\U‌​00002600-\U000027BF\‌​U0001f300-\U0001f64F‌​\U0001f680-\U0001f6F‌​F]'
  • @ WiktorStribi?电子战。也许我想的不对。我只想要我的表情符号、字母数字和标点符号。我可以将对我的表情符号的负面展望与字母数字标点符号结合起来。如果有两个字节的表情符号和这个匹配,那么我认为这种情况将是罕见的。他们肯定会脱颖而出。我可以将它们粘贴到谷歌的工作表中,使用那里的unicode函数来查找它们的代码,并编写一些python来捕获这些代码。感谢您提供的负面前瞻性示例。我现在测试一下
  • 参见emooji v12.0,例如391*人举重*。看看它包含多少字节。你的emoji regex只匹配其中的一部分。


我一起去:

1
2
3
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)

它去掉了所有其他的表情符号,只留下了心和书的表情符号,以及字母数字和标点符号。

作为我最初问题的一部分,有没有一种方法可以将它们叠加起来?目前,这是一行很长的代码。我们能做点什么吗?

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

那会用到垂直房地产,但我同意

  • 你应该避免在回答中提出单独的问题。如果您有另一个与您的问题相关的小问题,您可以将其添加为评论、问题的编辑或引用此问题的新问题。
  • 在您的例子中,这里已经有了一个答案:stackoverflow.com/questions/33211404/&hellip;
  • 我还发现了发音符号,在去掉所有其他符号之前必须先去掉。请看这个答案,成功的奇迹:)stackoverflow.com/questions/517923/&hellip;
  • @跳得不太好-我的问题在那里没有回答。这与使用字符串或re.verbose进行多行编辑有关。然而,我想知道在我最初的问题中,是否可以将2个重新编译添加到一起。事后看来,我应该在原始问题中添加regex=+re.compile(b)示例,以使我的问题更清晰。


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

我认为最简单的方法是找到字符串中所有的emojis,除了那些你想保留的元素,然后像你想做的那样用空字符串替换它们。要做到这一点,您可以使用一个regex来查找任何emoji(在本例中,我将使用[\U00010000-\U0010ffff],但我确信有更好的emoji,所以请使用其中一个),并添加一个否定的前瞻性来忽略您希望保留的emoji。

最后一个regex应该类似于:

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

第一部分(?![\u2764])将确保匹配不是您希望保留的emoji,第二部分[\U00010000-\U0010ffff]将确保它是emoji。

你可以在方括号(?![\u2764中添加你希望保留的所有其他符号。这里是])

  • "unicode选项"与使用的u字符串文字前缀op无关。不需要注意,在操作代码中,u是多余的。如果op使用正确的emoji regex,那么如果否定的emoji是更长的允许emoji的起始部分,那么否定的lookahead可能会失败。
  • @ WiktorStribi?ew关于"unicode选项"的部分只是对op的回应,即regex101没有"unicode选项",我同意这不会帮助op解决他的问题,但我认为知道这一点很好。如果你认为我应该删除它,我会删除的。关于长表情符号的否定先行否定部分:你确定吗?我认为regex将整个emoji视为一个字符,这样就不会有问题了。
  • @ WiktorStribi?你能解释一下"失败"与更长时间的记忆有关吗?它会匹配我的表情符号和更长的表情符号,还是两者都不匹配,从而导致它们被删除?
  • @Giladshnoor啊,谢谢您右边的regex101 unicode标志:)谢谢您显示将unicode放入负向前看的正确语法。今天要尝试的新事物:)谢谢你和Wiktor帮助一个新手。