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

Regex Python3正则表达式:保留一些表情符号,丢弃其余的,regex,python-3.x,emoji,regex-negation,python-unicode,Regex,Python 3.x,Emoji,Regex Negation,Python Unicode,这里没有。我有一些字符串,我想保留一些表情符号,并丢弃其余的 输入: 这本书真有趣❤️. 这本书regex101有一个Unicode选项,它是一个可以从regex框右侧打开的标志 我认为最简单的方法是找到字符串中的所有表情符号,除了那些你想保留的表情符号,然后像你想做的那样用空字符串替换它们。要做到这一点,您可以使用一个正则表达式来查找任何表情符号(在本例中,我将使用[\U00010000-\U0010ffff],但我确信还有更好的,所以请使用其中的一个),并添加一个负面展望来忽略您希望保留的表

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

输入:


这本书真有趣❤️. 这本书regex101有一个Unicode选项,它是一个可以从regex框右侧打开的标志

我认为最简单的方法是找到字符串中的所有表情符号,除了那些你想保留的表情符号,然后像你想做的那样用空字符串替换它们。要做到这一点,您可以使用一个正则表达式来查找任何表情符号(在本例中,我将使用
[\U00010000-\U0010ffff]
,但我确信还有更好的,所以请使用其中的一个),并添加一个负面展望来忽略您希望保留的表情符号

最终正则表达式应类似于:

第一部分
(?![\u2764])
将确保匹配项不是您希望保留的表情符号,第二部分
[\U00010000-\U0010ffff]
将确保它是一个表情符号

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

我选择了:

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)

这将使用垂直不动产,但我同意这一点

事实上,您使用了错误的正则表达式来匹配表情符号,您匹配了很多其他东西,不仅仅是表情符号,而且您错过了很多超过2字节的表情符号。在使用Python3.x时,应该放弃
u
前缀,默认情况下,所有字符串都是UTF8字符串。要解决这个问题,请使用否定的lookaheadSee,
(?)?!(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0E1])[\U00002600-\U000027BF\U0001f300-\U0001f64F\U0001f680-\U0001f6FF]“
@WiktorStribiżew。也许我想错了。我真的只想要我的表情符号、字母数字和标点符号。我可以将我的表情符号的负面展望与字母数字标点符号结合起来。如果有两个字节的表情符号和这两个匹配,我认为这种情况会很少见。它们肯定会站得住脚。”ut.我可以将它们粘贴到google工作表中,并使用unicode函数查找它们的代码,然后编写一些python来捕获它们。感谢您提供的负面前瞻示例。我现在将对其进行测试。请看,例如#391*男子举重*。查看它由多少字节组成。您的表情正则表达式将只匹配其中的一小部分。“unicode选项”与OP使用的
u
字符串文字前缀无关。
u
在OP代码中是多余的。
u
在OP代码中是多余的。如果OP使用正确的emoji正则表达式,如果被否定的emoji是一个较长允许的emoji的开始部分,则否定的前瞻可能会失败。@WiktorStribiż查看关于“Unicode选项”的部分只是回应OP说regex101没有“Unicode选项”我同意这不会帮助OP解决他的问题,但我认为知道这一点很好。如果你认为我应该删除它,我会这样做。关于较长表情符号的否定前瞻否定部分:你确定吗?我认为正则表达式将整个表情符号视为一个字符,因此它不会是一个字符problem@WiktorStribi你能解释一下“失败”吗关于更长的允许表情符号。它会匹配我的表情符号和更长的表情符号,还是两者都不匹配,这将导致它们被删除?@GiladShnoor啊,谢谢你在右边的regex101 unicode标志:)谢谢你展示了将unicode放入负面展望的正确语法。今天要尝试的新事物:)Tha感谢您和Wiktor帮助新手。您应该避免在回答中单独提问。如果您有其他与您的问题相关的小问题,您可以将其添加为注释、an或a,并引用此问题。在您的情况下,这里已经有了答案:我还发现了发音符号,在剥离之前必须将其删除其他问题都解决了。看看这个答案,奇迹般地解决了:)@Hoppeduppeanut不完全-我的问题没有得到回答。这与多行编辑有关,无论是使用字符串还是re.verbose。而我想在我的原始问题中知道是否可以将两个re.compile添加在一起。事后看来,我应该添加我的regex=+re.compile(b)在我的原始问题中添加示例,使我的问题更清楚。
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)