6
respostas

Como remover substrings duplicadas de uma string?

Preciso remover substrings duplicadas e deixar a primeira letra da frase maiúscula. As frases viriam de um banco de dados não especificado.

Exemplos:

inputs

 1 - oo rarato roeroeu aa rouroupa dodo rerei dde romroma
   2 - bebe 
   3 - Barbara bebe com Bernardo 

outputs esperados:

1 - O rato roeu a roupa do rei de roma        
2 - Be    
3 - Barbara bebe com bernardo

O que consegui até agora foi:

frase= str(#Digitar a frase aqui)
frase_tratada= frase.upper()

nova = re.sub(r'(.+?)\1+', r'\1', frase_tratada) 
nova2= nova.capitalize() 
print(nova2)

outputs:

1 - O rato roeu a roupa do rei de roma #Output corret
2 - Be #Output correto
3 - Bara be com bernardo #output INCORRETO

Existe uma forma de fazer isso sem utilizar whitelists, ou algo do tipo?

6 respostas

Olá Paulo!

Eu não sei como será exatamente seu input, mas, baseado nos seus exemplos, me parece um pouco complicado que a mesma palavra (ex. "bebe") tenha resultados distintos com o mesmo algoritmo. Além disso, esse código dá resultados igualmente estranhos no caso de "banana" ("bana"), ou "voo" ("vo").

Não me parece ser possível sem usar a comparação com um dicionário, para executar apenas com palavras "erradas". E ainda assim, teriam casos difíceis como "meme", que pode ser uma duplicação ou pode ser a palavra correta.

Sim, é verdade. Cheguei a mesma conclusão.

Mas ao mesmo tempo, esqueci da seguinte regra:

"Sua tarefa é remover duplicação do início de cada palavra de um texto, mas somente se todas as palavras do texto tiverem duplicação."

Ou seja, a frase 3 não passaria pelo tratamento completo, apenas pelo capitalize(). Estou buscando uma forma de verificar isso agora. Tem alguma ideia de como posso começar?

Nesse caso, acho que uma verificação anterior, com o mesmo regex, bastaria... caso encontre alguma palavra que não dê match - não tenha duplicação - não executa o re.sub, apenas o capitalize().

Não tenho ideia de como usar o mesmo (ou qualquer outro) regex para determinar se o texto deve ou não passar pelo tratamento. Poderia me ajudar?

Python não é minha linguagem principal, então provavelmente deve ter alguma forma mais eficiente/elegante para fazer isso, mas o código abaixo funciona para os seus exemplos:

import re
frase= str('Barbara bebe com Bernardo')
frase_tratada = frase.upper()

x = re.findall(r'(.+?)\1+', frase_tratada)

if(len(x) == len(frase_tratada.split())):
    nova = re.sub(r'(.+?)\1+', r'\1', frase_tratada)
    nova = nova.capitalize()
else:
    nova = frase_tratada.capitalize()

print(nova)

O x recebe uma lista com todas as ocorrências de duplicação. Se o tamanho dessa lista for igual a quantidade de palavras na frase (calculada com o split()), significa que todas tem duplicação e portanto deve haver a substituição. Se for false, ele só faz o capitalize().

Espero que ajude!

Perfeito!

Eu estava tentando algo exatamente assim. Muito obrigado