繁体   English   中英

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

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

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

我可以得到这样的代码:

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_]

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

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

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

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

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

请参阅正则表达式演示 请参阅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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM