Back to Blog
Python

Python String Replace: Syntax and Usage

python string replace: Learn how to use Python's string replace method effectively, including count limits, case sensitivity, and when to switch to re.sub.

PythonString MethodsText Processingreplacere.sub
Illustration of a Python string being transformed by a replace operation, showing old and new substrings.

python string replace requires a clear understanding of the core syntax, runtime behavior, and practical implementation patterns demonstrated in the examples below.

The replace method is the standard way to substitute substrings in a Python string. Its syntax is straightforward: str.replace(old, new[, count]). It returns a new string where every occurrence of old is replaced by new. If count is given, only the first count occurrences are replaced. Because Python strings are immutable, the original string remains unchanged, and a new string object is returned.

Basic Usage and Return Value

The simplest call replaces all occurrences of a substring:

text = "one fish, two fish, red fish, blue fish" result = text.replace("fish", "bird") print(result) # one bird, two bird, red bird, blue bird

Note that replace works with substrings of any length, not just single characters. It also handles empty strings as the old argument, which inserts new at every position, including the start and end:

"abc".replace("", "-") # -a-b-c-

This behavior is rarely useful but worth knowing because it can surprise developers who assume an empty pattern is ignored.

Limiting Replacements with the Count Parameter

The optional count parameter restricts how many replacements are performed from the left. This is useful when you want to replace only the first or first few occurrences:

s = "apple, apple, apple" s.replace("apple", "orange", 2) # orange, orange, apple

If count is negative or greater than the actual number of occurrences, all occurrences are replaced. The count parameter is applied before any overlapping matches are considered, but replace never matches overlapping substrings. For example, replacing "aa" in "aaa" yields "ba" (not "bb") because after the first match, the search continues from the end of that match.

Case Sensitivity and Case-Insensitive Replacement

The replace method is case-sensitive. To replace regardless of case, you need to normalize the string first or use a regular expression. A common approach is to convert both the target and the search string to lowercase, but that changes the output case. For pattern-based replacement that preserves original casing, re.sub with the re.IGNORECASE flag is more appropriate:

import re s = "Hello World, hello universe" re.sub("hello", "hi", s, flags=re.IGNORECASE) # hi World, hi universe

Note that re.sub replaces all matches by default and also supports a count argument. For simple literal replacements, str.replace is faster and simpler; for case-insensitive or pattern matching, re.sub is the right tool.

Chaining Multiple Replacements

To replace several different substrings, you can chain replace calls. Each call returns a new string, so the order matters:

s = "cat and dog" s.replace("cat", "bird").replace("dog", "fish") # bird and fish

Be careful when replacement strings contain the original search string. For example, replacing "a" with "aa" in "a" gives "aa", but if you chain replacements, the second call may operate on the already-replaced text. In such cases, consider a single traversal using re.sub with a callback or a dictionary mapping.

Performance and Memory Behavior

Each replace call creates a new string and copies the entire original content, even if only one occurrence changes. This is inherent to Python's immutable string design. For a one-off replacement, the overhead is negligible. However, in a loop that repeatedly modifies a string, this can lead to quadratic time complexity because each iteration copies the growing string. Instead, collect parts in a list and join them, or use re.sub for complex transformations.

Another performance consideration is that replace with a simple literal is implemented in C and is very fast. If you need to replace many different substrings, a single re.sub with a function that looks up replacements from a dictionary is often more efficient than chaining many replace calls, especially for long strings.

When to Use re.sub Instead of replace

str.replace is limited to literal substring replacement. If you need to match patterns, use re.sub. Common cases include:

  • Replacing with case-insensitive matching
  • Replacing based on regex patterns (e.g., digits, word boundaries)
  • Using a function to compute the replacement dynamically
Featurestr.replacere.sub
Pattern matchingLiteral onlyRegex patterns
Case-insensitiveNot directlyWith re.IGNORECASE
Count limitYesYes
Replacement functionNoYes
Performance for simple literalsFasterSlower

For simple literal replacements, replace is the right choice. For anything that requires pattern logic, re.sub is more expressive and avoids multiple passes over the string.

Common Pitfalls and Edge Cases

One frequent mistake is assuming replace modifies the string in place. Because strings are immutable, forgetting to assign the result leads to no change:

s = "hello" s.replace("l", "L") # result discarded print(s) # still "hello"

Another edge case is replacing overlapping substrings. replace does not handle overlaps; it scans left to right and skips the matched portion. For example, replacing "aba" in "ababa" yields "Xba" (the first match consumes positions 0-2, leaving "ba"). This is usually the desired behavior, but it can surprise developers expecting all possible matches.

Finally, when replacing with an empty string, replace effectively deletes the old substring. This is a common way to remove characters or substrings:

"remove spaces here".replace(" ", "") # removespaceshere

Be aware that replace with an empty old argument inserts the replacement everywhere, which is rarely what you need. Always test edge cases with short examples to confirm the behavior matches your expectation.

python string replace: Practical Usage and Code Examples | RYUSLOG DEV