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