Substituindo a última ocorrência de uma string. (Python)

Substituindo a última ocorrência de uma string. (Python)

Overview

Alguma vez você já precisou substituir apenas a última ocorrência de uma palavra em uma string e não sabia como fazer isso de forma simples? No post de hoje, vamos desvendar uma técnica interessante e acessível para realizar essa tarefa, mostrando que nem sempre precisamos recorrer a soluções complexas. Com um exemplo pragmático e fácil de seguir, você vai aprender a manusear strings de maneira mais eficaz em Python. Prepare-se para adicionar mais uma ferramenta ao seu kit de desenvolvimento!

Para substituir parte de uma string, geralmente utilizamos a função replace. Todavia, ela substitui todas as ocorrências de uma substring e nem sempre é isso que queremos. Neste post, mostro como substituir apenas a última ocorrência.

O procedimento todo é bem simples. Vamos considerar a seguinte frase:

text = "The quick brown fox jumps over the lazy fox."

Na frase acima (armazenada na variável text), quero substituir apenas a última ocorrência de fox por dog. Para isso, vou precisar de mais uma variável, que vai armazenar a posição da última ocorrência de “fox”.

str_pos = text.rfind("fox")

Agora temos a posição onde a palavra fox começa. O que vamos fazer para substituir é simples: Pegar o texto até onde começa a última ocorrência da palavra fox, incluir dog e depois colocar o resto do texto.

Não acho esta uma técnica particularmente elegante, mas resolve o problema.

new_text = "{text_before_replace}{str_find}{rest_of_text}".format(text_before_replace=text[:str_pos], str_find="dog", rest_of_text=text[str_pos+len(str_find):])

O que fiz acima foi:

  1. Criar uma string que vai armazenar nossa frase alterada;
  2. Formatar esta string para preencher os placeholders
  3. Na formatação:
    1. text[:str_pos] : recupera todo o texto da variável até a o inicio da última ocorrência da palavra fox.
    2. “dog” : este é o segundo argumento do .format. Neste ponto que a palavra dog vai entrar no lugar da palavra fox;
    3. text[str_pos+3:] : neste ponto, retiro outro slice da variável de texto, mas agora pegando a parte que vem após a palavra fox. A ideia é pegar tudo após a palavra fox, ou seja, da posição onde a palavra começa (str_pos) + o tamanho da palavra (+3, pois fox tem 3 letras).

Com a técnica acima, conseguimos substituir apenas a última ocorrência. Poderíamos utilizar regex também, mas acho que seria ainda menos eficiente.

Espero ter ajudado!