【问题标题】:remove only consecutive special characters but keep consecutive [a-zA-Z0-9] and single characters仅删除连续的特殊字符,但保留连续的 [a-zA-Z0-9] 和单个字符
【发布时间】:2020-01-22 09:55:38
【问题描述】:

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

我可以得到如下代码:

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*!@#$.,但不能相同,如++--...

【问题讨论】:

  • re.sub(r'([^\w\s])\1+',' ',text)re.sub(r'(\W)\1+',' ',text)

标签: python regex python-re


【解决方案1】:

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

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

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

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

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

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

请参阅regex demo。见Python demo

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.

【讨论】:

  • 非常感谢维克托。为什么_ 里面有_ 呢?
  • @Deshwal 匹配 \W_\W 匹配除字母、数字和 _ 之外的任何字符。 _ 不是字母数字,因此您需要将其与 \W“组合”,因此使用字符类。
  • 哦!好的。我知道但认为 _ 可能有一些特别之处,例如 [^] 中的 ^
猜你喜欢
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 2012-05-15
  • 2019-05-03
  • 2015-01-07
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多