我正在尝试从字符串中删除除#
,@
,:)
,:(
以外的所有字符。
示例:
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
它正在运行,但是在:)
和:(
的情况下,:
仍被匹配。
我知道它是匹配的,因为它正在检查每个字符和前面的字符,例如::)
仅匹配:
,而:))
匹配:)
。
答案 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 @ # :)