Python String Replace: Guia completo de str.replace() e além
Updated on
A substituição de strings é uma das operações mais frequentes no processamento de texto. Você precisa limpar entrada de usuário, normalizar formatos de dados, ocultar informações sensíveis ou transformar strings de template. O str.replace() do Python lida com casos simples em uma linha, mas fica aquém quando você precisa de correspondência case-insensitive, padrões regex ou substituições condicionais. Escolher a ferramenta errada significa complicar tarefas simples desnecessariamente ou escrever código frágil para as complexas.
Este guia cobre cada abordagem para substituição de strings em Python -- do básico str.replace() ao re.sub() com regex, translate() no nível de caracteres e padrões práticos para processamento de texto do mundo real.
str.replace(old, new, count)
O método mais simples e comum. Substitui todas as ocorrências de old por new. Um count opcional limita o número de substituições.
text = "Hello World, Hello Python, Hello Everyone"
# Substituir todas as ocorrências
print(text.replace("Hello", "Hi"))
# Hi World, Hi Python, Hi Everyone
# Substituir apenas as 2 primeiras ocorrências
print(text.replace("Hello", "Hi", 2))
# Hi World, Hi Python, Hello Everyone
# Remover uma substring (substituir por string vazia)
messy = " extra spaces here "
print(messy.replace(" ", ""))
# extraspaceshereComportamento principal
- Retorna uma nova string (strings são imutáveis em Python)
- Sensível a maiúsculas/minúsculas por padrão
- Substitui todas as ocorrências a menos que
countseja especificado - Retorna a string original inalterada se
oldnão for encontrado
original = "Python is great"
new = original.replace("great", "awesome")
print(original) # Python is great (inalterado)
print(new) # Python is awesomeSubstituição case-insensitive
str.replace() é sempre sensível a maiúsculas/minúsculas. Para substituição case-insensitive, use re.sub() com a flag re.IGNORECASE.
import re
text = "Python is Great, python is Fun, PYTHON is Everywhere"
# Substituição case-insensitive
result = re.sub(r'python', 'Java', text, flags=re.IGNORECASE)
print(result)
# Java is Great, Java is Fun, Java is EverywhereSubstituição regex com re.sub()
re.sub(pattern, replacement, string, count, flags) substitui correspondências de um padrão regex.
import re
# Substituir dígitos por '#'
text = "Call 555-1234 or 555-5678"
print(re.sub(r'\d', '#', text))
# Call ###-#### or ###-####
# Substituir números de telefone completos
print(re.sub(r'\d{3}-\d{4}', '[OCULTADO]', text))
# Call [OCULTADO] or [OCULTADO]
# Substituir múltiplos espaços por um único
messy = "too many spaces here"
print(re.sub(r'\s+', ' ', messy))
# too many spaces hereUsando grupos de captura
import re
# Trocar nome e sobrenome
names = "Smith, John\nDoe, Jane\nBrown, Bob"
swapped = re.sub(r'(\w+), (\w+)', r'\2 \1', names)
print(swapped)
# John Smith
# Jane Doe
# Bob Brown
# Adicionar formatação a datas
dates = "Meeting on 2026-02-10 and 2026-03-15"
formatted = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', dates)
print(formatted)
# Meeting on 02/10/2026 and 03/15/2026Usando uma função para substituição dinâmica
Passe uma função em vez de uma string para substituições condicionais:
import re
def censor_word(match):
word = match.group()
return word[0] + '*' * (len(word) - 1)
text = "The password is secret and the code is hidden"
censored = re.sub(r'secret|hidden', censor_word, text)
print(censored)
# The password is s***** and the code is h*****import re
# Converter para title case apenas palavras específicas
def smart_capitalize(match):
word = match.group()
minor_words = {'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to'}
if word.lower() in minor_words:
return word.lower()
return word.capitalize()
title = "the quick BROWN fox AND the lazy DOG"
result = re.sub(r'\b\w+\b', smart_capitalize, title)
print(result)
# the Quick Brown Fox and the Lazy DogSubstituições múltiplas
Encadear chamadas de replace()
text = "Hello World! How are you?"
result = text.replace("Hello", "Hi").replace("World", "Earth").replace("you", "they")
print(result) # Hi Earth! How are they?Substituição baseada em dicionário
Para muitas substituições, use um dicionário com re.sub():
import re
def multi_replace(text, replacements):
"""Substituir múltiplas substrings usando um dicionário."""
pattern = re.compile('|'.join(re.escape(k) for k in replacements))
return pattern.sub(lambda m: replacements[m.group()], text)
text = "The cat sat on the mat with another cat"
replacements = {
'cat': 'dog',
'mat': 'rug',
'sat': 'stood',
}
print(multi_replace(text, replacements))
# The dog stood on the rug with another dogSubstituição no nível de caracteres com translate()
Para substituir caracteres individuais, str.translate() com str.maketrans() é a opção mais rápida:
# Substituir caracteres: a->@, e->3, o->0
table = str.maketrans('aeo', '@30')
text = "Hello World"
print(text.translate(table))
# H3ll0 W0rld
# Remover caracteres específicos
remove_vowels = str.maketrans('', '', 'aeiouAEIOU')
print("Hello World".translate(remove_vowels))
# Hll Wrld
# Substituir E remover em uma única chamada
table = str.maketrans({'a': '@', 'e': '3', ' ': None})
print("apple pie".translate(table))
# @ppl3pi3Comparação de métodos
| Método | Melhor para | Regex | Velocidade | Flexibilidade |
|---|---|---|---|---|
str.replace() | Substituições simples e literais | Não | Mais rápido | Baixa |
re.sub() | Correspondência de padrões, regras complexas | Sim | Moderada | Mais alta |
str.translate() | Mapeamento de caracteres individuais | Não | Muito rápido | Baixa |
.replace() encadeado | Poucas substituições literais | Não | Rápido | Baixa |
Dict + re.sub() | Muitas substituições simultâneas | Sim | Moderada | Alta |
Exemplos práticos
Limpar e normalizar texto
import re
def clean_text(text):
"""Normalizar texto para processamento."""
text = text.strip()
text = re.sub(r'\s+', ' ', text) # Colapsar espaços em branco
text = re.sub(r'[^\w\s.,!?-]', '', text) # Remover caracteres especiais
text = text.lower()
return text
raw = " Hello!!! This is MESSY @#$ text... "
print(clean_text(raw))
# hello!!! this is messy text...Substituição de string de template
template = "Dear {name}, your order #{order_id} ships on {date}."
data = {
'name': 'Alice',
'order_id': '12345',
'date': 'Feb 15, 2026',
}
# Usar str.format_map (melhor que substituição manual)
result = template.format_map(data)
print(result)
# Dear Alice, your order #12345 ships on Feb 15, 2026.Ocultar dados sensíveis
import re
def redact_pii(text):
"""Ocultar e-mails, números de telefone e SSNs."""
text = re.sub(r'\b[\w.]+@[\w.]+\.\w+\b', '[EMAIL]', text)
text = re.sub(r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b', '[TELEFONE]', text)
text = re.sub(r'\b\d{3}-\d{2}-\d{4}\b', '[SSN]', text)
return text
msg = "Contact john@example.com or call 555-123-4567. SSN: 123-45-6789"
print(redact_pii(msg))
# Contact [EMAIL] or call [TELEFONE]. SSN: [SSN]Processamento de dados de texto no Jupyter
Limpeza e transformação de texto é um trabalho iterativo -- você testa padrões contra dados de amostra, ajusta regex e verifica resultados. RunCell (opens in a new tab) é um agente de IA para Jupyter que pode ajudá-lo a construir e depurar pipelines de processamento de texto interativamente, testando padrões de substituição contra seus dados reais em tempo real.
FAQ
Como substituir uma substring em Python?
Use str.replace(old, new) para substituições simples: "hello world".replace("world", "python") retorna "hello python". Isso substitui todas as ocorrências. Adicione um terceiro argumento para limitar substituições: text.replace("a", "b", 2) substitui apenas as 2 primeiras correspondências.
Como fazer uma substituição case-insensitive em Python?
Use re.sub() com a flag re.IGNORECASE: re.sub(r'python', 'Java', text, flags=re.IGNORECASE). O método embutido str.replace() não suporta correspondência case-insensitive.
Como substituir múltiplas strings diferentes de uma vez?
Construa um padrão regex a partir de um dicionário de substituições: crie um padrão compilado que corresponda a todas as chaves, então use um lambda para buscar a substituição de cada correspondência. Alternativamente, encadeie chamadas a .replace() para um pequeno número de substituições literais.
Qual é a diferença entre str.replace() e re.sub()?
str.replace() faz apenas correspondência literal de strings -- é mais rápido e simples. re.sub() usa expressões regulares, suportando correspondência de padrões, grupos de captura, referências retroativas e substituições baseadas em funções. Use str.replace() para trocas literais simples e re.sub() quando precisar de flexibilidade de padrões.
Como remover caracteres de uma string em Python?
Três abordagens: str.replace(char, "") remove todas as ocorrências de uma substring específica. str.translate(str.maketrans("", "", chars)) remove eficientemente todos os caracteres especificados. re.sub(r"[pattern]", "", text) remove caracteres que correspondam a um padrão regex.
Conclusão
Python oferece múltiplas ferramentas para substituição de strings, cada uma adequada para diferentes níveis de complexidade. Use str.replace() para trocas literais simples, re.sub() para correspondência de padrões e regras complexas, e str.translate() para mapeamento rápido no nível de caracteres. Para múltiplas substituições simultâneas, uma abordagem de re.sub() baseada em dicionário mantém seu código limpo e manutenível.