1

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

我可以得到如下代码:

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*!@#$.但不一样++--...

4

1 回答 1

1

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

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

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

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

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

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

请参阅正则表达式演示。请参阅Python 演示

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

输出:

 .AAA.x. +*@#= xx000 x  .x 
x*+Y.
于 2020-01-22T10:07:33.580 回答