How to Replace Characters in a String in Python

What you’ll build or solve

You’ll replace characters in a Python string using the two most practical approaches.

When this approach works best

Replacing characters in a string works best when you want to:

  • Clean input, like turning / into - in dates or removing separators from IDs.
  • Normalize text before comparing, like replacing spaces with _ in usernames.
  • Prepare text for output, like standardizing delimiters before writing files.

This is a bad idea when you need pattern-based rules, like “replace digits only if they appear after a #”. For that, use regular expressions.

Prerequisites

  • Python 3 installed
  • You know what a string variable is

Step-by-step instructions

1) Replace characters with replace()

Use str.replace(old, new) to replace every occurrence. Add a third argument to limit how many replacements happen.

Option A: Replace all occurrences (most common)

text = "a-b-c"
fixed = text.replace("-", "_")
print(fixed)  # a_b_c

Option B: Replace only the first few occurrences

path = "2026/02/18/report"
fixed = path.replace("/", "-", 1)
print(fixed)  # 2026-02/18/report

What to look for: replace() returns a new string, so assign the result back to a variable.

name = "ana-maria"
name.replace("-", " ")
print(name)  # still "ana-maria"

Correct approach:

name = name.replace("-", " ")
print(name)

2) Replace multiple characters with translate()

If you need to replace several single characters, translate() keeps your code short and readable.

text = "report-2026/02/18:final"
table = str.maketrans({
    "-": "_",
    "/": "_",
    ":": "_",
})
fixed = text.translate(table)
print(fixed)

What to look for: translate() works best for single-character replacements. For multi-character swaps like "->" to "→", use replace().


Examples you can copy

Example 1: Convert date separators for filenames

date_str = "2026/02/18"
safe = date_str.replace("/", "-")
print(safe)  # 2026-02-18

Example 2: Normalize a username by replacing spaces

username = "Noor Ali"
normalized = username.lower().replace(" ", "_")
print(normalized)  # noor_ali

Example 3: Remove common separators from a phone number

phone = "+382 (67) 123-456"
clean = (
    phone.replace(" ", "")
    .replace("(", "")
    .replace(")", "")
    .replace("-", "")
    .replace("+", "")
)
print(clean)

Example 4: Replace several separators with underscores

name = "a-b/c:d"
table = str.maketrans({"-": "_", "/": "_", ":": "_"})
fixed = name.translate(table)
print(fixed)

Example 5: Replace a multi-character token

expr = "a->b"
fixed = expr.replace("->", "→")
print(fixed)

Common mistakes and how to fix them

Mistake 1: Forgetting to store the returned string

What you might do

text = "a-b"
text.replace("-", "_")
print(text)

Why it breaks

Strings are immutable, so replace() does not modify the original string.

Corrected approach

text = "a-b"
text = text.replace("-", "_")
print(text)

Mistake 2: Using translate() for multi-character replacements

What you might do

text = "a->b"
table = str.maketrans({"->": "→"})
fixed = text.translate(table)

Why it breaks

translate() maps single characters, not multi-character sequences.

Corrected approach

text = "a->b"
fixed = text.replace("->", "→")
print(fixed)

Troubleshooting

If nothing changes, do this:

Assign the result of replace() or translate() to a variable.

If replacements happen too many times, do this:

Use replace(old, new, count) to limit how many replacements happen.

If you need to replace several different single characters, do this:

Use translate() with str.maketrans(...) instead of long replace() chains.

If you need to replace a multi-character token, do this:

Use replace() with the full token, like text.replace("->", "→").


Quick recap

  • Use replace() for simple character swaps.
  • Add count to replace() to limit replacements.
  • Use translate() for many single-character replacements.
  • Use replace() for multi-character tokens.