用于匹配所有字符的正则表达式,除了一些特殊字符和“:)”

RegEx for matching all chars except some special chars and ":)"

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

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

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

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

(\w|:\)|:\(|#|@| )

用这个假句子:

“我想删除某些字符,但又想保留某些字符,例如 #random、:) 和 :( 以及 @。

如果在另一个句子中找到,:),请搜索它:( "

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

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

:)
:(

为了处理这个问题,我们可以先保留冒号 : 和括号,然后有选择地删除其中一个,如果它不是笑脸或皱眉的一部分:

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 @ & # & :)

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

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

这将匹配任何不是单词或空白字符的字符。它还使您的白名单免于替换。在交替的其他两个部分中,我们然后通过删除冒号和括号来覆盖这个逻辑,如果它们不是是笑脸的一部分。

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

import re

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

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

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

参见regex demo。 此处,([#@\s]|:[)(]) 匹配并 捕获 到第 1 组 a #@、空白字符或 :(:(子字符串和 \W 匹配而不捕获任何 non-word 字符。

参见Python demo

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

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

re.sub(r'([#@\s]|:[)(])|\W', lambda x: x.group(1) if x.group(1) else '', s)