python - python - 用于匹配除某些特殊字符和":)之外的所有字符的正规表达式"

我正在尝试删除字符串中的所有字符,除了#@:):( ,例如:


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



 

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

时间:

这个问题很棘手,因为你想删除除特定白名单之外的所有符号,此外,白名单上的某些符号实际上包含两个字符:

 
:)


:(



 

为了处理这个问题,我们可以先备份冒号:和括号,然后选择性地删除一个笑脸或皱眉,


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


output = re.sub(r'[^ws:()@&#]|:(?![()])|(?<!:)[()]', '', input)


print(output)



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



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

 
[^ws:()@&#]



 

这将匹配任何不是单词或空白字符的字符,它还可以从替换中备份你的白名单,在其他两个部分中,我们重写这个逻辑,通过删除冒号和括号,它们不是笑脸的一部分。

正如其他人已经表明的那样,可以编写一个正则表达式,它将成功解决问题。但是,在这种情况下,编写正规表达式来匹配你想要保留的内容要简单得多,那就把这些部分结合起来。


import re



rgx = re.compile(r'w|s|@|&|#|:)|:(')


orig = 'Blah!! Blah.... ### .... #@:):):) @@ Blah! Blah??? :):)#'


new = ''.join(rgx.findall(orig))


print(new)



你可以尝试以下正规表达式(用于python )。

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



 

用这个假句子:

" I want to remove certain characters but want to keep certain ones like #random ,and :) and :( and something like @.

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

它查找你在问题中提到的所有字符,你可以使用它找到包含它的字符串,并编写规则以小心地从这个字符串中删除其他。

你还可以使用简单的方法: 匹配和捕获从匹配中获取的内容,并仅匹配要删除的内容,然后只使用后向引用:


re.sub(r'([#@s]|:[)(])|W', r'1', s)


# ^---Group 1--^->->->->^^ 



正规表达式演示这里. ([#@s]|:[)(])匹配,并且捕获组1中的一个# ,,空格字符或:(:(子字符串和W匹配不捕获任何非单词字符。

请参见python演示


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



在3.5之前的python版本中,使用一个lambda experession作为替换参数(由于错误):


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



...