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

标签 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

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

最佳答案

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

:)
:(

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

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

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

关于python - 用于匹配所有字符的正则表达式,除了一些特殊字符和 ":)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56091632/

相关文章:

python 多处理问题

python - 从另一个文件导入类变量Python

java - 如何在另一个注释中创建和使用具有给定日期的 DateFormat?

python - Matplotlib 中的重复刻度标签

python - 如何沿批量维度广播 numpy 索引?

java - 正则表达式匹配连字符斜杠括号内的字母数字

regex - 如何在Lua中写一个等价于/(\(\))?$/in js的正则表达式

php获取css文件中的所有类名

c - 字符串文字未正确打印出来

java - 如何在 Java 中比较字符串?