【发布时间】:2011-03-19 21:00:45
【问题描述】:
给定一串文本,在 Python 中:
s = "(((((hi abc )))))))"
s = "***(((((hi abc ***&&&&"
如何将出现超过 3 次的所有非字母符号替换为空白字符串
对于以上所有,结果应该是:
hi abc
【问题讨论】:
-
如果输入为
"(&*hello!@#",输出应该是什么?
给定一串文本,在 Python 中:
s = "(((((hi abc )))))))"
s = "***(((((hi abc ***&&&&"
如何将出现超过 3 次的所有非字母符号替换为空白字符串
对于以上所有,结果应该是:
hi abc
【问题讨论】:
"(&*hello!@#",输出应该是什么?
这应该有效:\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 或更多”。
【讨论】: