Olá Edson,
A primeira coisa a observar é que o algoritmo que está buscando precisa considerar a sobreposição das letras. Se não precisasse considerar, sua solução iria causar a sensação de resposta correta, pois "BANANA" só tem duas "ANA" sobrepondo a letra "A" que está em negrito. Se não fosse isso a solução seria muito mais simples como segue abaixo:
frase = "ANA E MARIANA GOSTAM DE BANANA"
palavra = "ANA"
print(frase.count((palavra)))
# Imprime 3, como no seu algoritmo
Ainda assim seu algoritmo retornaria o valor errado sem sobreposição conforme o exemplo abaixo:
frase = "ANA E MARIANA GOSTAM DE BANANAANA"
palavra = "ANA"
print(frase.count((palavra)))
# Este novo algoritmo simples iria imprimir 4 quando neste caso você estaria esperando 5
# Seu algoritmo original iria continuar imprimindo 3 pois além de não considerar as sobreposições, conta apenas a primeira ocorrência na palavra em cada palavra
Posta esta introdução, podemos dizer que temos a compreensão do problema:
- Contar as ocorrências de determinado padrão em uma frase
- Considerar os overlaping (todos os métodos disponíveis no patote "re" do python são non-overlaping, se não quisesse contar os overlaping a solução seria ainda mais simples)
Desta forma, segue o código comentado:
# Importando compile de re
from re import compile
frase = "ANA E MARIANA GOSTAM DE BANANA"
palavra = "ANA"
pattern = compile(palavra) # "Compilando" o padrão /ANA/
start = 0 # Marcador de posição de início na frase
count = 0 # Contador de ocorrências
while start < len(frase): # posição na frase tem que ser menor que o tamanho da frase, caso contrarío haverá um IndexError
if pattern.search(frase[start:]): # Entra no bloco caso encontre uma ocorrência do padrão usando string slicing
count += 1 # Incrementa contador
start += pattern.search(frase[start:]).start() # O .start() faz com que se retorne o índice da frase onde se inicia o padrão encontrado
start += 1 # Incrementa a posição na frase em uma unidade. Sem este incremento o script entra em loop infinito pois o mesmo padrão sempre será encontrado
print(count)
Ajudou a entender?
Abraços