How to replace multiple substrings of a string? How to replace multiple substrings of a string? python python

How to replace multiple substrings of a string?


Here is a short example that should do the trick with regular expressions:

import rerep = {"condition1": "", "condition2": "text"} # define desired replacements here# use these three lines to do the replacementrep = dict((re.escape(k), v) for k, v in rep.iteritems()) #Python 3 renamed dict.iteritems to dict.items so use rep.items() for latest versionspattern = re.compile("|".join(rep.keys()))text = pattern.sub(lambda m: rep[re.escape(m.group(0))], text)

For example:

>>> pattern.sub(lambda m: rep[re.escape(m.group(0))], "(condition1) and --condition2--")'() and --text--'


You could just make a nice little looping function.

def replace_all(text, dic):    for i, j in dic.iteritems():        text = text.replace(i, j)    return text

where text is the complete string and dic is a dictionary — each definition is a string that will replace a match to the term.

Note: in Python 3, iteritems() has been replaced with items()


Careful: Python dictionaries don't have a reliable order for iteration. This solution only solves your problem if:

  • order of replacements is irrelevant
  • it's ok for a replacement to change the results of previous replacements

Update: The above statement related to ordering of insertion does not apply to Python versions greater than or equal to 3.6, as standard dicts were changed to use insertion ordering for iteration.

For instance:

d = { "cat": "dog", "dog": "pig"}my_sentence = "This is my cat and this is my dog."replace_all(my_sentence, d)print(my_sentence)

Possible output #1:

"This is my pig and this is my pig."

Possible output #2

"This is my dog and this is my pig."

One possible fix is to use an OrderedDict.

from collections import OrderedDictdef replace_all(text, dic):    for i, j in dic.items():        text = text.replace(i, j)    return textod = OrderedDict([("cat", "dog"), ("dog", "pig")])my_sentence = "This is my cat and this is my dog."replace_all(my_sentence, od)print(my_sentence)

Output:

"This is my pig and this is my pig."

Careful #2: Inefficient if your text string is too big or there are many pairs in the dictionary.


Why not one solution like this?

s = "The quick brown fox jumps over the lazy dog"for r in (("brown", "red"), ("lazy", "quick")):    s = s.replace(*r)#output will be:  The quick red fox jumps over the quick dog