How to replace a string in python For example If the text is 'new words are newest n ew' and i want to replace 'new' word with 'y' If I use string.replace command The above text will change to 'y words are yest n ew' I don't want this to happen Ideally it should be 'y words are newest y' Could some body throw some light on how to achieve this using python.
- 
                    1Have you tried anything yet? The [manual](https://docs.python.org/2/library/string.html) lists string functions. – scrappedcola Nov 13 '14 at 04:37
- 
                    I dont see other option for string replacement in the [manual](https://docs.python.org/2/library/string.html). – Amar Reddy Nov 13 '14 at 04:39
- 
                    2search for `replace`, hint it's at the bottom of the page – scrappedcola Nov 13 '14 at 04:39
- 
                    The other option i can go for is to use a dictionary. And make a exhaustive list of all the cases. But that doesnt seem to be an effective way. – Amar Reddy Nov 13 '14 at 04:40
- 
                    So there is a special rule for "n ew". Are there any other special rules? You need to specify _exactly_ what is needed – John La Rooy Nov 13 '14 at 04:40
- 
                    `string.replace(s, old, new[, maxreplace])` Return a copy of string s with all occurrences of substring old replaced by new. If the optional argument maxreplace is given, the first maxreplace occurrences are replaced. – scrappedcola Nov 13 '14 at 04:41
- 
                    The text i mentioned is just an example. The replacement should happen only for the word that i needed. Here the word is 'new' – Amar Reddy Nov 13 '14 at 04:43
- 
                    True!You can use dictionary! check this thread but you need to distinguish between different cases http://stackoverflow.com/questions/6116978/python-replace-multiple-strings – user3378649 Nov 13 '14 at 04:44
- 
                    'n ew' is also equivalent to 'new', ofcourse it has space between words. But i dont want 'newest' to be changed because it is a different word from 'new' – Amar Reddy Nov 13 '14 at 04:44
- 
                    hi [scrappedcola](http://stackoverflow.com/users/462006/scrappedcola). I have already used the replace command and posted the result also in the question – Amar Reddy Nov 13 '14 at 04:46
2 Answers
>>> s = 'new words are newest n ew'
>>> import re
>>> re.sub(r'\bn\s*e\s*w\b', 'y', s)
'y words are newest y'
'\bn\s*e\s*w\b' is a regular expression
\b means a word break
n, e, w mean the letter "n", "e", "w" respectively
\s* means zero or more whitespace characters
The regex given here may not be exactly what you need. You need to describe the rules exactly if you need a more (or less) restrictive regex.
 
    
    - 295,403
- 53
- 369
- 502
- 
                    This is not very helpful for someone who wanna understand things! without explaining the code, regular expression is an advanced topic. – user3378649 Nov 13 '14 at 04:45
- 
                    1Hi gnibbler. Thanks for your answer. But i am not familiar with the 're' module. I will go through it – Amar Reddy Nov 13 '14 at 04:49
- 
                    @user3378649, looking forward to see your answer using a dictionary. – John La Rooy Nov 13 '14 at 05:05
If you don't want to mess with regular expressions (although i suggest you do because they are so powerful) because they're hard to grasp, you could try something like the following:
Create a list with every word of your string and then iterate through the list and replace every word if it matches the string 'new'. Then print the list as a string (or you may assing it to a new/old variable the same way)
wordy = 'new words are newest n ew'
wordy_list = wordy.split()
for i, x in enumerate(wordy_list):
    if x == 'new':
        wordy_list[i] = 'y'
print(' '.join(wordy_list))
You could also write a one line lambda function which does the same thing like the following:
wordy = 'new words are newest n ew'
new_replace = lambda x: x if x != 'new' else 'y'
print(' '.join([new_replace(x) for x in wordy.split()]))
 
    
    - 969
- 10
- 24
 
    