Python replace function [replace once]
Question: I need help with a program I'm making in Python.

Assume I wanted to replace every instance of the word `"steak"` to `"ghost"`
(just go with it...) but I also wanted to replace every instance of the word
`"ghost"` to `"steak"` at the same time. The following code does not work:

    
    
     s="The scary ghost ordered an expensive steak"
     print s
     s=s.replace("steak","ghost")
     s=s.replace("ghost","steak")
     print s
    

it prints: `The scary steak ordered an expensive steak`

What I'm trying to get is `The scary steak ordered an expensive ghost`


Answer: I'd probably use a regex here:

    
    
    >>> import re
    >>> s = "The scary ghost ordered an expensive steak"
    >>> sub_dict = {'ghost':'steak','steak':'ghost'}
    >>> regex = '|'.join(sub_dict)
    >>> re.sub(regex, lambda m: sub_dict[m.group()], s)
    'The scary steak ordered an expensive ghost'
    

Or, as a function which you can copy/paste:

    
    
    import re
    def word_replace(replace_dict,s):
        regex = '|'.join(replace_dict)
        return re.sub(regex, lambda m: replace_dict[m.group()], s)
    

Basically, I create a mapping of words that I want to replace with other words
(`sub_dict`). I can create a regular expression from that mapping. In this
case, the regular expression is `"steak|ghost"` (or `"ghost|steak"` \-- order
doesn't matter) and the regex engine does the rest of the work of finding non-
overlapping sequences and replacing them accordingly.

* * *

_Some possibly useful modifications_

  * `regex = '|'.join(map(re.escape,replace_dict))` \-- Allows the regular expressions to have special regular expression syntax in them (like parenthesis). This escapes the special characters to make the regular expressions match the literal text.
  * `regex = '|'.join(r'\b{0}\b'.format(x) for x in replace_dict)` \-- make sure that we don't match if one of our words is a substring in another word. In other words, change `he` to `she` but not `the` to `tshe`.

