Skip to content

Python String Replacement - How to Find and Swap Text Values

In a community I participate in, a developer recently asked a fundamental but crucial question: “How do I find and replace specific text from a variable? I have a string like ‘Hello World’ and I want to change ‘World’ to ‘Python’ but I keep getting the original string back.”

This is a common stumbling block because of how Python handles strings. If you are coming from a language where strings are mutable, Python’s behavior can be confusing.

The most straightforward way to replace text in a Python string is the .replace() method. However, you must re-assign the result to a variable because strings in Python are immutable.

# Python 3.10+ (Works in 3.x)
text = "The quick brown fox jumps over the lazy dog."
# Correct way: Re-assign the variable
text = text.replace("fox", "cat")
print(text)
# Output: The quick brown cat jumps over the lazy dog.

Detailed Explanation: Why your fix might “fail”

Section titled “Detailed Explanation: Why your fix might “fail””

The most common mistake developers make is calling text.replace("old", "new") without capturing the return value.

In Python, strings are immutable. This means once a string object is created in memory, it cannot be changed. When you call .replace(), Python does not modify the original string; instead, it creates a brand-new string with the replacements applied and returns it.

If you do this:

text = "Hello World"
text.replace("World", "Python") # The return value is discarded
print(text) # Still prints "Hello World"

The logic executed, but the result was lost in space. Always assign the result back to the original variable or a new one.


Solution A: Simple Substring Replacement (The .replace() Method)

Section titled “Solution A: Simple Substring Replacement (The .replace() Method)”

Use this when you know exactly what text you are looking for and it is a literal string.

Version: Python 3.x (Illustrative example)

data = "User ID: 12345 | Status: Pending"
# Syntax: string.replace(old, new, count)
# count is optional; it limits how many occurrences are replaced
cleaned_data = data.replace("Pending", "Active")
print(cleaned_data)

Pros:

  • Extremely fast.
  • Easy to read.
  • No external libraries required.

Cons:

  • Case-sensitive (it won’t find “pending” if you search for “Pending”).
  • Does not support complex patterns (like “any number”).

Solution B: Pattern-Based Replacement (The re Module)

Section titled “Solution B: Pattern-Based Replacement (The re Module)”

Use this when you need to replace text based on a pattern (e.g., replacing all email addresses, phone numbers, or case-insensitive matches).

Version: Python 3.12 (Standard library)

import re
text = "Contact us at [email protected] or [email protected]"
# Replace any email pattern with [REDACTED]
pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
redacted_text = re.sub(pattern, "[REDACTED]", text)
print(redacted_text)
# Output: Contact us at [REDACTED] or [REDACTED]

Why this works: The re.sub() function searches the string for all occurrences of the regular expression pattern and replaces them with your specified string.


If you want to replace “Python” regardless of whether it’s “python”, “PYTHON”, or “PyThOn”, use re.sub with the IGNORECASE flag.

# Python 3.11+ illustrative example
import re
text = "I love pYtHoN programming."
new_text = re.sub(r"python", "JavaScript", text, flags=re.IGNORECASE)
print(new_text) # I love JavaScript programming.

If you need to replace a dictionary of terms, calling .replace() multiple times is inefficient. Instead, use a loop or a regex function.

# Python 3.10+
replacements = {"red": "blue", "slow": "fast"}
text = "The red car is very slow."
for old, new in replacements.items():
text = text.replace(old, new)
print(text) # The blue car is very fast.

How do I replace items in a List instead of a String? Lists are mutable, but .replace() is a string method. To update a list, you usually use a list comprehension:

# Python 3.x
my_list = ["apple", "banana", "cherry"]
my_list = [item.replace("banana", "orange") for item in my_list]

Is there a performance difference between .replace() and re.sub()? Yes. .replace() is significantly faster because it performs a direct memory scan for a literal string. re.sub() is much more powerful but carries the overhead of compiling a regular expression and running a state machine. Use .replace() whenever possible and save re for complex patterns.

What if I want to replace based on position rather than value? If you want to replace the first 5 characters of a string, don’t use replace. Use slicing:

text = "ABCDEFGHIJ"
text = "12345" + text[5:] # Replaces the first 5 chars