如何使用正则表达式替换所有子字符串的出现?

34

我有一个字符串,s = 'sdfjoiweng%@$foo$fsoifjoi',我想用'bar'替换'foo'

我尝试使用re.sub(r'\bfoo\b', 'bar', s)re.sub(r'[foo]', 'bar', s),但它们都没有起作用。我错在哪里了?


1
print re.sub(r'\bfoo\b', 'bar', s) is correctly giving me sdfjoiweng%@$bar$fsoifjoi - anubhava
1
也许你错误地期望s被就地修改?在 Python 中,字符串是不可变的。经过修改的新字符串将由 re.sub 返回。 - jez
1
抱歉造成困惑,我是一个正则表达式的初学者,完全忘记了字符串不能直接修改。我重新测试了我的原始代码,确实可以工作。 - ThanksInAdvance
4个回答

43

您可以直接替换它:

>>> import re
>>> s = 'sdfjoiweng%@$foo$fsoifjoi'
>>> print(re.sub('foo','bar',s))
sdfjoiweng%@$bar$fsoifjoi

它也能适用于以下更多的foo出现情况:

>>> s = 'sdfjoiweng%@$foo$fsoifoojoi'
>>> print(re.sub('foo','bar',s))
sdfjoiweng%@$bar$fsoibarjoi
如果你只想替换字符串中第一次出现的foo而不是所有foo的出现,那么alecxe的答案正好做到了这一点。

1
我不确定 OP 是否同意在单词的某些部分替换 foo,就像你的第二个例子一样。 - alecxe
此外,为什么要使用re.sub()而不是replace()呢? - alecxe
1
@alecxe,我完全同意你的观点,即“replace”也可以使用,因为它被认为更易读,但OP特别要求使用“regex”。至于第一条评论,OP应该明确指出是否希望在单词的部分中替换“foo”。 - coder

7

re.sub(r'\bfoo\b', 'bar', s)

这里的\b定义了单词边界 - 即单词字符(\w)和非单词字符之间的位置,正好与您在sdfjoiweng%@$foo$fsoifjoi字符串中匹配的foo相对应。对我来说很有效:

In [1]: import re

In [2]:  s = 'sdfjoiweng%@$foo$fsoifjoi'

In [3]: re.sub(r'\bfoo\b', 'bar', s)
Out[3]: 'sdfjoiweng%@$bar$fsoifjoi'

我唯一的问题是\b在单词周围有空格时无法正常工作。你有什么解决办法吗?例如s ='sdfjoiweng%@$foo foo $fsoifjoi'将无法正常工作。 - Geeocode

5

您可以直接使用replace函数而不是使用正则表达式。

>>> s = 'sdfjoiweng%@$foo$fsoifjoifoo'
>>>
>>> s.replace("foo","bar")
'sdfjoiweng%@$bar$fsoifjoibar'
>>>
>>>

1
为了进一步补充上文,以下代码展示了如何一次替换多个单词!我用这种方法一步替换了165,000个单词!!
注意\b意味着不匹配子字符串..必须是整个单词..如果你删除它,则会进行子字符串匹配。
import re
s = 'thisis a test'
re.sub('\bthis\b|test','',s)

This gives:

'thisis a '

我唯一的问题是\b在单词周围有空格时无法正常工作。因此,例如:re.sub('\bthis\b|test', '', 'thisis this a test') 的结果是 thisis this a。你有什么解决办法吗? - Geeocode
我想要得到“thisis a”作为结果。因此,我想要替换字符串中的第二个“this”。 - Geeocode
更易懂的例子:thisis this this a test 转换为 thisis that that a that - Geeocode
1
哦,太好了,谢谢 :-)...我本来会建议采用两步方法来解决问题,但看起来你已经找到了解决方案...你能否请发布你的解决方案,这样我也可以学习一下呢? :-) - Chadee Fouad
1
这是我的解决方案:re.sub("\bthis\b|test", "Q", re.sub(" this ", " Q ", "thisis this is a test"))。它是一个嵌套的van,就像我谈到的嵌套解决方案一样,但当然也可以是两行代码(就像我实际上做的那样)。结果是:thisis Q is a Q - Geeocode
显示剩余3条评论

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