def iter_find(_str, to_find, n=0): """ Finds all occurences of `to_find` in `_str`. Itering-ready. """ _str_len = len(_str) to_find_len = len(to_find) while n <= _str_len: if _str[n:n+to_find_len] == to_find: yield n n += 1 def ireplace(text, old, new): """ Replaces as occurences of `old` with the string pattern `new`. The `new` variable has to be a string (additionally containing a placeholder where the matches go (`%s`). """ assert(isinstance(text, str) and isinstance(old, str)) use_string_format = '%s' in new old_len = len(old) to_replace = [] for match in iter_find(text.lower(), old.lower()): match = text[match:match+old_len] if match not in to_replace: if use_string_format: to_replace.append((match, new % match)) else: to_replace.append((match, new)) for rule in to_replace: text = text.replace(*rule) return text