在Python中如何使用正则表达式进行替换?

3

在Python中,如果有一个文本字符串:

s = "(((((hi abc )))))))"
s = "***(((((hi abc ***&&&&"

如何将所有出现超过3次的非字母符号替换为空字符串...

对于上述所有情况,结果应该是:

hi abc

如果输入为"(&*hello!@#",输出应该是什么? - Laurence Gonsalves
3个回答

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
@John:正确。这些例子包括“***”,所以我猜他想要3+...我相信,有了这个解决方案,他可以想出如何添加一个。这就是为什么我用斜体强调了“3或更多”。 - Stephen

4

如果您想替换任何非空格非字母数字序列(例如'!?&'以及您的示例),@Stephen的回答就可以了。但是,如果您只想替换三个或更多相同的非字母数字序列,使用反向引用会有所帮助:

>>> r3 = re.compile(r'(([^\s\w])\2{2,})')
>>> r3.findall('&&&xxx!&?yyy*****')
[('&&&', '&'), ('*****', '*')]

因此,举个例子:
>>> r3.sub('', '&&&xxx!&?yyy*****')
'xxx!&?yyy'

+1,我回来为我的答案添加反向引用,但我会让你得到它... :) - Stephen
@John,是的,但正如@Stephen已经解释的那样,OP在英语上犯了一个小错误比在他所期望的行为示例中犯了一个大错误更可信;-)。 - Alex Martelli

0

你不能(使用正则表达式)轻松地将其替换为与被替换文本相同长度的“空字符串”。你可以用空字符串""或单个空格" "或任何其他常量字符串来替换它;在示例中,我使用了"*",以便更容易看到发生了什么。

>>> re.sub(r"(\W)\1{3,}", "*", "12345<><>aaaaa%%%11111<<<<..>>>>")
'12345<><>aaaaa%%%11111*..*'
>>>

请注意:它不会改变"<><>"...我假设"出现超过3次的非字母符号"意味着同一符号必须出现超过3次。我还假设您是指"超过3次"而不是"3次或更多次"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接