【发布时间】:2019-08-03 13:45:59
【问题描述】:
这里是菜鸟。我有字符串,我想保留一些表情符号并丢弃其余的。
输入:
这本书太有趣了❤️。这本书 ????是炸弹(最好的 在世界上 ???? ?????? )我爱 ???? ??? ???它!我绝对推荐它!'
期望的输出:
这本书太有趣了❤️。这本书是炸弹(最好的 在世界上)我爱???? ??? ???它!我绝对推荐它!'
我有匹配的 re.compile:
- 我的表情符号
- 所有表情符号Removing Emoticons from....。请参阅 David Mabodo 的回答
我不知道如何在 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 中将多个正则表达式组合在一起。假设我想保留字母数字和我的表情符号,当我这样做时它会抱怨
re.compile(u'(\Uxxxx)' | r'(regex)' )。 | 不支持的操作数类型:“str”和“str”,因此 OR 类型语句在此处不起作用……并且 OR 会产生不希望的结果。
我能提供一些帮助吗:
- 忽略表情符号子集并删除其余表情符号(我的首选解决方案)
- 保留(字母数字、标点符号和我的表情符号),并删除其余部分。
- 一个具体的问题:你能“堆栈”重新编译吗? IE 创建 2 个不同的 re.compiles 来匹配(或不匹配)事物,然后将它们连接在一起。
【问题讨论】:
-
实际上,你使用了错误的正则表达式来匹配表情符号,你匹配了很多其他的东西,而不仅仅是表情符号,你错过了很多包含超过 2 个字节的表情符号。当您使用 Python 3.x 时,您应该丢弃
u前缀,默认情况下所有字符串都是 UTF8 字符串。为了解决这个问题,请使用负前瞻 -
见regex101.com/r/rwTlgF/1,
'(?![\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])[\U00002600-\U000027BF\U0001f300-\U0001f64F\U0001f680-\U0001f6FF]' -
@WiktorStribiżew。也许我在想这个错误。我真的只想要我的表情符号、字母数字和标点符号。我可以将我的表情符号的负面预测与字母数字标点符号结合起来。如果有 2 字节的表情符号并且匹配,那么我认为这种情况将很少见。他们肯定会脱颖而出。我可以将它们粘贴到谷歌表格中,并在那里使用 unicode 函数来查找它们的代码,然后编写一些 python 来捕获它们。感谢您提供负面的前瞻性示例。我现在就测试一下
-
见Emooji v12.0,例如#391*男子举重*。查看它包含多少字节。您的表情符号正则表达式只会匹配其中的一小部分。
标签: regex python-3.x emoji regex-negation python-unicode