Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida no Ex. 6 da Aula 7 - Expressão regulares

No último exercício da aula, implementamos uma função em nosso código que seria um aprimoramento da função de busca antes já criada. A função aprimorada é essa:

def search_regex(names):
    import re
    names_string = ''.join(names)
    print 'Quem você quer encontrar?'
    search = raw_input()
    found = re.findall(search, names_string)
    print 'Encontramos os seguintes resultados: %s' %(found)

O problema é que essa função nos retorna - se nossa busca encontrou algo - exatamente o que buscamos. Ou seja, se na array de nomes (names) há o nome Yan Orestes e minha busca for Orestes, o programa vai imprimir apenas o Orestes. Tentei deixar para que qualquer caractere antes ou depois (e zero ou mais vezes) do nome que quero buscar apareça, mas por conta de o que eu quero buscar ser uma variável, a busca não foi possível.

Basicamente, havia tentado algumas formas de adicionar um '.' antes e depois da variável search no primeiro parâmetro da função re.findall . Alguém pode me explicar como fazer isso?

3 respostas

Corrigindo a formatação no final, ficou meio estranho:

Basicamente, havia tentado algumas formas de adicionar um '*.' antes e depois da variável search no primeiro parâmetro da função re.findall . Alguém pode me explicar como fazer isso?

solução!

Oi Yan, eu entendi o que você quer fazer, mas dentro do contexto desse exercício não vai funcionar (no final da minha resposta vem uma solução diferente).

No exercício, usamos o macete de concatenarmos toda a string. Por exemplo, temos:

nomes = ['Fabio', 'Yan','Nico']

Quando fazemos:

nomes_em_string  = ''.join(nomes)

Se imprimirmos a variável nomes_em_string temos:

FabioYanNico

É uma string só, então se você procurar por bio como ele saberá que tem que trazer Fabio e não FabioYanNico?

O exercício pedia era uma melhoria na organização do código, não na busca, mas mantendo-me fiel ao exercício, para que você consiga o que deseja, precisamos alterá-lo um pouco.

Segue uma solução:

import re
procurado = raw_input()
nomes = ['Fabio Pimentel', 'Yan Orestes','Nico Steppat']
achado = ''
for nome in nomes:
    if re.findall(procurado, nome):
        achado = nome
        break
print(achado)

Veja que não transformei o Array em String, pelo contrário, varri com o Python em um loop for. Daí, para cada item do Array, aplico a expressão regular. Se o item tiver a expressão procurada, eu guardo não o retorno da expressão, mas aquele item do array em outra variável chamada achado e paro o loop imediatamente com um break.

Agora, se você digitar Yan, ele vai retornar Yan Orestes. Esse algotítimo pode melhorar, no lugar de você retornar o primeiro com aquela ocorrência, pode guardar em outra lista todos aqueles que contenham a parte que você está procurando e por ai vai.

Pode copiar o código que passei e colar em um arquivo .py para testar.

Espero ter ajudado.

Bom estudo Yan!

Obrigado pela ajuda, Flavio!

Eu tinha feito algo parecido com um laço for, mas não tinha aplicado a expressão regular!