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?
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.
foo being replaced in parts of words, like in your second case.re.sub() then and not replace()?replace also could be used instead - as it is considered more readable, but the OP asked specifically for regex. As for the first comment the OP should specify if he wants foo being replaced in parts of words.
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'
s = 'sdfjoiweng%@$foo foo $fsoifjoi' won't workTo 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 '
e.g: re.sub('\bthis\b|test', '', 'thisis this a test') results in thisis this a Do you have some solution on it?thisis a as a result. So I want to replace the 2nd this in the string.thisis this this a test to thisis that that a thatre.sub("\bthis\b|test", "Q", re.sub(" this ", " Q ", "thisis this is a test")) It is a nested van, as I talked about a nested solution, but of course it can be a two liner as well (as I actually did it). The result: thisis Q is a Q
print re.sub(r'\bfoo\b', 'bar', s)is correctly giving mesdfjoiweng%@$bar$fsoifjoisto be modified in place? Strings in Python are immutable. The new modified string will be returned byre.sub.