RegEx用于匹配除某些特殊字符和“ :)”之外的所有字符

时间:2019-05-11 15:18:12

标签: python regex string regex-negation regex-lookarounds

我正在尝试从字符串中删除除#@:):(以外的所有字符。 示例:

this is, a placeholder text. I wanna remove symbols like ! and ? but keep @ & # & :)

应导致(删除匹配的结果之后):

this is a placeholder text I wanna remove symbols like  and  but keep @  #  :)

我尝试过:

(?! |#|@|:\)|:\()\W

它正在运行,但是在:):(的情况下,:仍被匹配。 我知道它是匹配的,因为它正在检查每个字符和前面的字符,例如::)仅匹配:,而:))匹配:)

4 个答案:

答案 0 :(得分:6)

这是一个棘手的问题,因为您要删除除特定白名单之外的所有符号。另外,白名单上的某些符号实际上由两个字符组成:

:)
:(

要解决此问题,我们可以先保留冒号:和括号,然后有选择地删除其中一个(如果它不属于笑脸或皱眉):

input = "this is, a (placeholder text). I wanna remove symbols like: ! and ? but keep @ & # & :)"
output = re.sub(r'[^\w\s:()@&#]|:(?![()])|(?<!:)[()]', '', input)
print(output)

this is a placeholder text I wanna remove symbols like  and  but keep @ & # & :)

我使用的正则表达式字符类是:

[^\w\s:()@&#]

这将匹配不是单词或空格字符的任何字符。它还可以从替换列表中省去您的白名单。在交替的其他两个部分中,我们随后通过删除冒号和括号(如果它们不是不是笑脸的一部分)来覆盖此逻辑。

答案 1 :(得分:3)

正如其他人所表明的那样,可以编写一个正则表达式来成功解决问题。但是在这种情况下,编写正则表达式来匹配您要保留的内容要简单得多。然后将这些部分连接在一起。

import re

rgx = re.compile(r'\w|\s|@|&|#|:\)|:\(')
orig = 'Blah!! Blah.... ### .... #@:):):) @@ Blah! Blah??? :):)#'
new = ''.join(rgx.findall(orig))
print(new)

答案 2 :(得分:2)

您可以尝试以下正则表达式(对于Python)。

sum(readmission)

用这个假句子:

“”我想删除某些字符,但要保留某些字符,例如#random和:)和:(以及类似@的内容。

如果在另一句话:)中找到它,请搜索它:(“

它将查找您在问题中提到的所有字符。您可以使用它来查找包含它的字符串,并编写规则以仔细删除该字符串中的其他标点符号。

答案 3 :(得分:1)

您还可以使用一种简单的方法:匹配并捕获需要从匹配中“排除”的内容,然后匹配要删除的内容,然后仅使用对捕获组值的反向引用:

re.sub(r'([#@\s]|:[)(])|\W', r'\1', s)
#        ^---Group 1--^->->->->^^         

请参见regex demo。  在这里,([#@\s]|:[)(])匹配并<捕获>捕获到组1 a #@,空格字符或:(:(子字符串和{ {1}}匹配但未捕获任何非单词char。

请参见Python demo

\W

在3.5之前的Python版本中,使用lambda表示作为替换参数(由于错误):

import re
s="this is, a placeholder text. I wanna remove symbols like ! and ? but keep @ & # & :)"
print(re.sub(r'([#@\s]|:[)(])|\W', r'\1', s))
# => this is a placeholder text I wanna remove symbols like  and  but keep @  #  :)