在Python中,如果有一个文本字符串:
s = "(((((hi abc )))))))"
s = "***(((((hi abc ***&&&&"
如何将所有出现超过3次的非字母符号替换为空字符串...
对于上述所有情况,结果应该是:
hi abc
\W{3,}
:匹配出现 3 次或更多的非字母数字字符:>>> s = "***(((((hi abc ***&&&&"
>>> re.sub("\W{3,}", "", s)
'hi abc'
>>> s = "(((((hi abc )))))))"
>>> re.sub("\W{3,}", "", s)
'hi abc'
如果您想替换任何非空格非字母数字序列(例如'!?&'
以及您的示例),@Stephen的回答就可以了。但是,如果您只想替换三个或更多相同的非字母数字序列,使用反向引用会有所帮助:
>>> r3 = re.compile(r'(([^\s\w])\2{2,})')
>>> r3.findall('&&&xxx!&?yyy*****')
[('&&&', '&'), ('*****', '*')]
>>> r3.sub('', '&&&xxx!&?yyy*****')
'xxx!&?yyy'
你不能(使用正则表达式)轻松地将其替换为与被替换文本相同长度的“空字符串”。你可以用空字符串""
或单个空格" "
或任何其他常量字符串来替换它;在示例中,我使用了"*"
,以便更容易看到发生了什么。
>>> re.sub(r"(\W)\1{3,}", "*", "12345<><>aaaaa%%%11111<<<<..>>>>")
'12345<><>aaaaa%%%11111*..*'
>>>
请注意:它不会改变"<><>"...我假设"出现超过3次的非字母符号"意味着同一符号必须出现超过3次。我还假设您是指"超过3次"而不是"3次或更多次"。