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

Pesquisa com Regex

Esse é código da função de pesquisa:

# -*- coding: UTF-8 -*-
import re


def procurar_regex(nomes):
    print('Digite a expressao regular')
    regex = raw_input()
    nomes_concatenados = ''.join(nomes)
    resultados = re.findall(regex,nomes_concatenados)
    print(resultados)

Essa é a execução:

Listando nomes:
maria
pedro
thiago
jose
Digite:
1 para cadastrar
2 para listar
3 para remover
4 para alterar
5 para pesquisar
6 para procurar na regex
0 para terminar
6
Digite a expressao regular
jo
['jo']
Digite:
1 para cadastrar
2 para listar
3 para remover
4 para alterar
5 para pesquisar
6 para procurar na regex
0 para terminar

Não entendi o por quê de ele não mostra a string completa mas apenas os caracteres que fez a leitura. Quando insiro 'jo' o programa mostra 'jo', não deveria ser 'jose'? Se insiro 'jose', é mostrado 'jose'. ?

Digite a expressao regular
jose
['jose']
Digite:
1 para cadastrar
2 para listar
3 para remover
4 para alterar
5 para pesquisar
6 para procurar na regex
0 para terminar
6 respostas

Para ter o efeito que você quer, você deve digitar "Jo.+" (sem as aspas). Em regex, o ponto (.) é um curinga. Significa qualquer caractere, exceto a quebra de linha \n e o "+" (mais) é o caractere guloso.

hum entendi. Mas a função findall não é o suficiente?

Neste caso específico, por estarem todas as strings concatenadas, o resultado esperado é este mesmo. Lembre-se que elas estão todas concatenadas em uma string só (na string nomes_concatenados) na função procurar_regex

solução!

O findall vai apenas "encontrar todas" as ocorrências da string padrão digitada na string de pesquisa (no caso a lista 'nomes_concatenados'). No caso do exemplo, se vc digitar 'F' como regex ele retorna uma lista com ['F', 'F'] isso porque 'F' (a string padrão digitada) está presente em ['FabioFlavioNico'] exatamente duas vezes. Entendeu?

Entendi. Valeu!

Como a regex inserida foi "jo", ele trás o resultado jo pois é este o que foi procurado. O erro não está na implementação do programa, e sim, na regex inserida para busca.

A regex mais correta, para este caso seria:

jo.+

Entenda a regex inserida:

Deseja-se buscar a string "jo", mais qualquer tipo de caracter, exceto a quebra de linha; isto é representado pelo meta-caracter "."; Somado ao meta-caracter ".", temos o meta-caracter "+" para indicar que qualquer tipo de caracter pode ocorrer mais de uma vez. Resultando assim, na seguinte lista:

['jose']

Mas note: se você tentar procurar o nome "thiago" com a mesma regex passada acima jo.+ alterando somente o "jo" por "th", o resultado será:

['thiago jose']