仅删除连续的特殊字符,但保留连续的 [a-zA-Z0-9] 和单个字符

remove only consecutive special characters but keep consecutive [a-zA-Z0-9] and single characters

如何删除字符串中连续多次出现的 all 特殊字符?

我可以获得如下代码:

re.sub('\.\.+',' ',string)
re.sub('@@+',' ',string)
re.sub('\s\s+',' ',string)

对于个人,在最好的情况下,对列表中的所有字符使用循环,例如:

from string import punctuation

for i in punctuation:
    to = ('\' + i + '\' + i + '+')
    string = re.sub(to, ' ', string)

但我相信也有一个有效的方法。

我试过了:

re.sub('[^a-zA-Z0-9][^a-zA-Z0-9]+', ' ', '\n\n.AAA.x.@@+*@#=..xx000..x..\t.x..\nx*+Y.')

但它删除了所有特殊字符,除了前面有字母的字符。

字符串可以有不同的连续特殊字符,如 99@aaaa*!@#$. 但不相同 ++--....

匹配 Python 中所有非字母数字字符的模式是 [\W_]

因此,您只需用捕获组包裹模式并在其后添加 + 以匹配连续出现 2 次或更多次相同的非字母数字字符:

text = re.sub(r'([\W_])+',' ',text)

在 Python 3.x 中,如果您希望使模式仅识别 ASCII,请使用 re.Are.ASCII 标志:

text = re.sub(r'([\W_])+',' ',text, flags=re.A)

注意使用定义原始字符串文字的 r 前缀(这样您就不必转义 \ 字符)。

参见regex demo. See the Python demo

import re
text = "\n\n.AAA.x.@@+*@#=..xx000..x..\t.x..\nx*+Y."
print(re.sub(r'([\W_])+',' ',text))

输出:

 .AAA.x. +*@#= xx000 x  .x 
x*+Y.