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

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!

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , , , .