Reputation: 547
I have a string, s = 'sdfjoiweng%@$foo$fsoifjoi'
, and I would like to replace 'foo'
with 'bar'
.
I tried re.sub(r'\bfoo\b', 'bar', s)
and re.sub(r'[foo]', 'bar', s)
, but it doesn't do anything. What am I doing wrong?
Upvotes: 38
Views: 65139
Reputation: 12972
You can replace it directly:
>>> import re
>>> s = 'sdfjoiweng%@$foo$fsoifjoi'
>>> print(re.sub('foo','bar',s))
sdfjoiweng%@$bar$fsoifjoi
It will also work for more occurrences of foo
like below:
>>> s = 'sdfjoiweng%@$foo$fsoifoojoi'
>>> print(re.sub('foo','bar',s))
sdfjoiweng%@$bar$fsoibarjoi
If you want to replace only the 1st occurrence of foo
and not all the foo
occurrences in the string then alecxe's answer does exactly that.
Upvotes: 48
Reputation: 2948
To further add to the above, the code below shows you how to replace multiple words at once! I've used this to replace 165,000 words in 1 step!!
Note \b means no sub string matching..must be a whole word..if you remove it then it will make sub-string match.
import re
s = 'thisis a test'
re.sub('\bthis\b|test','',s)
This gives:
'thisis a '
Upvotes: 1
Reputation: 4196
You can use replace function directly instead of using regex.
>>> s = 'sdfjoiweng%@$foo$fsoifjoifoo'
>>>
>>> s.replace("foo","bar")
'sdfjoiweng%@$bar$fsoifjoibar'
>>>
>>>
Upvotes: 5
Reputation: 473893
re.sub(r'\bfoo\b', 'bar', s)
Here, the \b
defines the word boundaries - positions between a word character (\w
) and a non-word character - exactly what you have matching for foo
inside the sdfjoiweng%@$foo$fsoifjoi
string. Works for me:
In [1]: import re
In [2]: s = 'sdfjoiweng%@$foo$fsoifjoi'
In [3]: re.sub(r'\bfoo\b', 'bar', s)
Out[3]: 'sdfjoiweng%@$bar$fsoifjoi'
Upvotes: 7