Dominando o RegEx com Python em 1 hora - Dojô ByLearn
Dominando o RegEx com Python em 1 hora
09/07/2020 Leitura: 15 min
Em um texto anterior, nós contamos tudo sobre as Expressões Regulares, elementos de fundamental importância tanto para pesquisas quanto para validação de dados. Já aprendemos que, com elas, é possível trabalhar de maneira mais rápida e eficiente , não é mesmo? Então aqui nós vamos nos aprofundar um pouco, te mostrando tudo o que você precisa saber para trabalhar usando o RegEx com Python, que é a nossa linguagem do coração.
Embora as Expressões Regulares (RegEx) não sejam uma linguagem de programação específica, dominá-las vai te ajudar a resolver desde tarefas do dia a dia até aquelas mais complicadas. Elas são importante tanto para pesquisas quanto para validação de dados.
Sendo programador, é possível usar as RegEx para diferentes fins dentro da sua rotina, como por exemplo:
Validação de dados, tais como:
Verificação de formatos, como por exemplo:
Buscas de palavras chaves em textos;
Extração/Mineração de informações;
Criação de realces (highlights);
Alteração de dados em texto, como:
Ocultar palavrões;
Corrigir palavras erradas;
Mudar textos padrões em templates;
Já deu para perceber que as possibilidades são muitas, não? Então vem com a gente que neste texto vamos te contar tudo o que você precisa saber para dominar o RegEx com Python.
1 Por que RegEx com Python?
2 Programando com RegEx
3 Testando nossos padrões de RegEx
4 Integrando Regex com Python
4.1 Criando o padrão
4.2 Importando o módulo do RegEx
4.3 Efetuando nossa busca
4.4 Buscando múltiplas ocorrências do RegEx com Python
4.5 Interagindo com os matchs
4.6 Substituindo dados no texto no RegEx com Python
4.6.1 Grupos de captura
4.7 Dividindo o texto
4.8 Validando strings no Regex com Python
4.8.1 Rematch
4.9 Utilizando Flags
4.10 Reutilizando padrões no RegEx com Python
5 Conclusão a respeito do RegEx com Python
Por que RegEx com Python?
Não é surpresa para você, ByLearner, que Python é a nossa queridinha. Com linguagem open source, sintaxe clara e grande versatilidade, ela vem conquistando o mercado de trabalho a passos largos e hoje já ocupa o terceiro lugar no ranking de popularidade da GitHub. Não deixe de ler o nosso texto sobre as inúmeras vantagens do Python para entender porque ela é tão amada.
Para enriquecer seu currículo e abrir portas nas maiores empresas de tecnologia, não se esqueça que nós, aqui na ByLearn, temos o melhor e mais completo de curso do mercado: Python completo – de Júnior a Sênior.
Career Success Building Teamwork Conceptual Ladder
Conosco você aprender tudo o que precisa sobre o Python, começando com uma completa introdução, passando pelos processos de instalação e configuração e finalizando com um módulo de tratamento de erros e exceções. Nós fazemos atualizações constantes e colocamos à disposição um material didático reunido especialmente para você, com apostilas e livros oficiais.
Se você quer elevar o seu nível de programação, não deixe de conferir o nosso e-book Boas Práticas com Python, que pode ser baixado gratuitamente no link abaixo.
Baixe o nosso e-book totalmente gratuito aqui
Programando com RegEx
O RegEx é compatível com toda linguagem de programação que se preze, sendo geralmente bem fácil de usar, especialmente o RegEx com Python.
O fluxo é sempre basicamente o mesmo: você escolherá um padrão (pattern) igual aos usados neste artigo e escolherá o texto base onde você buscará por esse padrão. O motor (engine) do RegEx da linguagem então irá procurar por uma correspondência (match) do seu padrão naquele texto.
Com isso, você pode tanto executar funções de substituição de texto (replace) quanto validação para saber se o texto realmente segue o padrão proposto (como no caso de validar e-mail ou checar se a senha é segura).
Testando nossos padrões de RegEx
Antes de começarmos a programar, deixo uma dica muito importante para o desenvolvimento de software: Pense e teste antes de agir. Depois, pense e teste o que foi feito.
Essa dica vale para tudo e todos, não importa o ponto que você estiver na sua carreira: não importa se você é um programador iniciante, ou tem anos de experiência no mercado de trabalho.
Afinal, caso implementarmos algo sem pensar ou testar/validar a nossa ideia, dificilmente o resultado estará certo, mesmo que o algoritmo não apresente nenhum problema de sintaxe. Isto é, o código será executado sem problemas, porém, a lógica dele estará errada para esse caso.
Para o caso das Expressões Regulares nós temos vários sites que servem como "ambiente de testes" para o padrão de RegEx escolhido e nos permitem ter um feedback visual instantâneo, sabendo se o que tentamos fazer irá ou não funcionar.
Como por exemplo, podemos testar o RegEx "[\d]{8,9}" em vários números de celular aleatórios e ver se vai pegar para todos os casos.
Dentre todos os sites disponíveis, o que eu acho mais completo e utilizo sempre que preciso é o RegEx101.
Nele, você consegue inserir padrões para buscas, textos para testar os padrões, uma explicação sobre o que o seu RegEx está fazendo, os resultados capturados e ainda gera códigos prontos para diversas linguagens.
Veja abaixo algumas imagens do site para entender melhor como usá-lo:
Campo para inserir o padrão RegEx e logo abaixo o campo de textos para teste.
Explicação do Regex
Integrando Regex com Python
Pronto! Agora já estamos totalmente preparados para começar a utilizar o Regex com Python!
Então sem mais delongas, vamos aos códigos?
Como somos bonzinhos, e para melhorar a experiência de vocês, todos nossos exemplos vão estar disponíveis via Gist no Github da ByLearn e podem ser acessados clicando aqui.
Também vamos deixar um link para executar o código final de cada tópico para você poder editá-lo para testes diretamente do seu navegador, mesmo que seja em dispositivos móveis, através do site Repl.it.
Antes de mais nada, é bom lembrar que o padrão de RegEx é universal, então se ele pegou em qualquer testador (como o RegEx101) ele pegará também no Python (e no C#, Java, JS…).
Porém, cuidado: a maior parte das linguagens de programação utiliza o "\" como tecla de escape, sendo assim, ela pode dar conflito com nosso RegEx.
Podemos resolver isso de duas formas, mudando o "\" por "\\", onde usamos o escape na própria barra, ou falando para a linguagem ignorar o escape e trate tudo como caractere literal (sem "poder especial", sendo considerada como um caractere comum).
No RegEx com Python a dica que eu dou é usar o "r" no início da string, assim, usamos a string como Raw String e passamos a tratá-la como uma String Literal.
Importando o módulo do RegEx
O Python utiliza o módulo re para executar o RegEx, sendo assim, precisamos importá-lo da seguinte maneira:
Efetuando nossa busca
Para buscarmos um padrão nós vamos executar o comando search (buscar, em inglês), da seguinte forma:
Como resultado temos None caso não encontre nada ou um objeto Match (correspondência) caso encontre. Para isso executaremos o seguinte código:
Veja esse código em ação clicando aqui.
Como saída (output) temos o seguinte:
<re.Match object; span=(19, 28), match='ByLearner'>
Como podemos perceber, o objeto Match tem duas propriedades, o span e o match, sendo eles:
span: Posição da ocorrência no formato (inicio, fim);
match: O texto encontrado na ocorrência.
Sendo assim, podemos executar o seguinte código:
Dessa forma, temos como output o seguinte:
Encontramos o padrão no texto, entre os índices: 19 e 28
Buscando múltiplas ocorrências do RegEx com Python
Repare agora se executarmos o código acima para um caso com mais de uma ocorrência, como por exemplo:
Encontramos o padrão no texto, entre os índices: 13 e 20
Repare que não é bem isso o que queríamos, não é mesmo? Ao invés de nos retornar todas as ocorrências e suas devidas posições o Python nos retornou somente a primeira delas.
Isso ocorre devido ao método re.search() trabalhar apenas com o primeiro match.
Para solucionar esse problema nós devemos usar o re.findall(), como no exemplo abaixo:
['rato', 'roupa', 'rei']
Interagindo com os matchs
Como nós pudermos ver no último exemplo, o findall() conseguiu achar todas as ocorrências, o que é bom para sabermos quantas existem no texto, porém, é ruim para fazer demais interações, pois não nos envia a posição do elemento, diferente do search().
Felizmente, nós podemos iterar os matchs através do finditer(), que busca todas as ocorrências e nos retorna em Match Objects (aqueles que vimos anteriormente, com group e span) e pode ser usado da seguinte forma:
Portanto, podemos usar o código da seguinte forma:
Veja esse código em ação aqui.
Encontrei: rato entre os índices (2, 6)
Encontrei: roupa entre os índices (14, 19)
Encontrei: rei entre os índices (23, 26)
Agora já está ficando bem interessante, não é mesmo? Já conseguimos achar a primeira ocorrência, verificar se há ou não uma ocorrência no texto, encontrar todas as ocorrências e por fim interagir com todas elas.
Substituindo dados no texto no RegEx com Python
Assim como falamos no início do texto, um outro exemplo de uso bem importante do RegEx é substituir dados, ou seja, procuramos por um padrão e tudo que corresponder será substituído por outro termo, ou até mesmo por outro padrão RegEx.
Para começar pelo simples, vamos iniciar conhecendo a função para realizar a substituição, no caso, o re.sub() que pode ser visto abaixo:
Sendo assim podemos usar o seguinte código:
A caneca está na máquina de lavar canecas
Fácil, não é? Mas como pudemos ver, ele mudou todas as roupas por canecas, mas algumas vezes não queremos isso, as vezes só queremos trabalhar com a primeira ocorrência, ou com as 3 primeiras, e por aí vai…
Para isso nós podemos passar um parâmetro a mais no re.sub(), no caso será nosso quarto parâmetro, que será um valor numérico inteiro que informa quantas vezes vamos executar a substituição.
Veja abaixo um código que modifica apenas o primeiro match:
E assim como o esperado, apenas a primeira palavra quatro será substituída no texto, tendo o resultado abaixo:
Ótimo! Agora já sabemos coordenar bem a substituição do padrão por um novo termo, mas e agora de um padrão por outro padrão?
Para isso podemos usar os grupos de captura! Não sabe o que é isso? Não tem problema, está tudo explicadinho detalhe por detalhe aqui nessa outra postagem.
Em resumo, os grupos de captura nos permitem criar agrupamentos dentro do nosso padrão (como se fossem sub-grupos) e retorná-los para uso posterior.
Para isso, basta deixar o que queremos capturar entre parênteses.
Por exemplo, em um texto eu quero extrair o padrão "Eu sou um ByLeaner" e retornar dois grupos, sendo eles "By" e "Learner".
Neste caso, teremos o seguinte padrão:
"Eu sou um (By)(Leaner)"
Agora voltando para a programação, nós podemos usar o "\1" para pegar o primeiro grupo, o "\2" para o segundo e aí por diante…
Sendo assim, vamos procurar por todas palavras que iniciem por R e vamos trocá-lo por G, mas deixar o restante intacto, sem alterar nada.
Para isso, vamos capturar só o restante da palavra (exceto a inicial R) e na hora da substituição usar o "\1" para dizer que é para inserir aquele grupo que capturamos, vamos lá? Basta usarmos o seguinte código:
Como resultado dessa substituição temos o seguinte texto:
O gato goeu a goupa do gei de goma
Viu só? Simples, não é? E assim finalizamos a parte de substituições de dados e valores e estamos prontos para o próximo capítulo!
Podemos também dividir o nosso texto através de uma busca por Expressão Regular como, por exemplo, a cada ocorrência da palavra ByLearn nós criamos uma string nova, ou dividimos uma string inteira em uma lista onde cada palavra do texto original vire uma string.
Neste caso vamos usar o segundo exemplo, ou seja, dividir string palavra por palavra. Para isso, podemos usar o método re.split(), da seguinte forma:
Portanto, o código final será o seguinte:
['Venha', 'se', 'tornar', 'um', 'ByLeaner']
Fácil, não? E não para por aí, podemos fazer muitas outras coisas ainda com o RegEx com Python, como, por exemplo, validar strings.
Validando strings no Regex com Python
Para a próxima etapa vamos imaginar que queremos verificar o campo "email" do nosso formulário para vermos se o usuário realmente digitou um e-mail válido para cadatro.
Vamos supor que o usuário digitou o seguinte:
Bom… Não podemos dizer que está errado, ele digitou um e-mail no campo do formulário e é um e-mail válido, não é mesmo?
Se usarmos um re.search(), re.findall() ou qualquer outro método de busca visto até agora e passar um padrão que reconheça e-mails, ele vai retornar como válido, afinal, vai encontrar o "[email protected]".
Porém, não é isso que queremos! Nossa intenção que ao campo seja apenas um e-mail, como por exemplo:
Somente o e-mail, nada mais que isso!
Para isso, podemos usar o re.match() que trabalha verificando se desde o começo da nossa string (e não no início da linha, mesmo se usarmos o modo de multi-line que veremos em breve). Podemos executá-lo da seguinte forma:
Dessa forma, para lermos se a string inteira é composta por um e-mail, podemos usar o "^" no início e o "$" no final do padrão, ou seja, falamos para o RegEx que do início ao fim da string deverá existir o padrão entre esses dois caracteres.
Para ficar mais fácil, vamos usar como exemplo um padrão que encontra se um campo Nome e Sobrenome do nosso formulário é composto por duas palavras e somente duas (um nome e um sobrenome).
Com isso, teremos o seguinte código:
E como já é previsto, o resultado será:
Além do re.match(), que verifica apenas o início da string (necessitando do caractere "$" para simbolizar o fim do texto) temos também o método re.fullmatch() que automaticamente irá analisar do início ao fim da string, sendo assim, não temos necessidade de usar o "^" e o "$". Podemos usá-lo da seguinte forma:
Portanto, nosso código de validação final será:
E novamente como resultado teremos:
Bem simples, não é? E com isso podemos garantir de forma rápida e segura que nosso dado está no formato e padrão correto!
Reparou que no dentro desse tópico eu falei sobre o "modo multi-line"? Pois é… Quem leu o nosso artigo sobre tudo o que você precisa saber sobre o RegEx certamente entendeu na hora do que se trata e deve estar curioso para aprender como aplicar isso no RegEx com Python, então, vamos lá?
Utilizando Flags
O RegEx tem seu jeito (modo) próprio de trabalhar. Porém, certas vezes nós queremos ignorar essa "regrinha" e modificar a forma padrão com que ele atua, como por exemplo, considerar quebra de linhas na hora de analisar o texto (o famoso multi-line) ou ignorar o case-sentitive, isto é, parar de se importar em diferenciar letras minúsculas de letras maiúsculas.
Para isso, na hora de usar qualquer um dos métodos ensinados nesta postagem, basta usar o parâmetro flags e logo em seguida evidenciar quais flags serão aplicadas, e no caso de mais de uma, separá-las com uma barra reta, ("|"), como por exemplo:
A lista total de flags disponíveis é a seguinte:
re.ASCII;
re.DEBUG;
re.IGNORECASE;
re.LOCALE;
re.MULTILINE;
re.DOTALL;
re.VERBOSE.
Como exemplo de uso temos o seguinte código:
Como usamos a flag re.IGNORECASE, o case-sensitive deixa de agir. Sendo assim, o RegEx não se importa em diferenciar minúsculas de maiúsculas, dando o resultado abaixo:
Eu encontrei: <re.Match object; span=(0, 7), match='ByLearn'>
Eu encontrei: <re.Match object; span=(8, 15), match='ByLeArN'>
Eu encontrei: <re.Match object; span=(16, 23), match='BYLEARN'>
Eu encontrei: <re.Match object; span=(24, 31), match='Bylearn'>
Pronto! Mais um assunto dominado, agora chegou a vez de aprendermos nosso último tópico: Como reutilizar um padrão RegEx.
Reutilizando padrões no RegEx com Python
Muitas vezes nós queremos executar o mesmo padrão em vários campos diferentes, vamos supor que em um determinado software nós queremos validar que todos os campos estão apenas com letras minúsculas, já imaginou o tanto de repetição de linhas que teremos para verificar isso?
Toda hora criar um novo RegEx com o mesmo padrão e em seguida executar no texto desejado… Deveria existir um método mais fácil, não é mesmo? Afinal, estamos falando do Python, a linguagem que mais vem facilitando a vida dos programadores!
Conhecendo o Python você já sabe a resposta, não é mesmo? Possui sim uma maneira mais fácil!
Ela se dá através do re.compile() que irá compilar/salvar um padrão estabelecido para facilitar o uso futuro em diferentes textos, sendo usado da forma abaixo:
E para finalizar com grande estilo, um exemplo de uso usando gatinhos! Veja o código a seguir:
O que nos gera o seguinte resultado:
['gato', 'rato']
Pronto! Agora com apenas uma linha conseguimos "salvar" um padrão para ser reutilizado futuramente e cada vez que ele for ser usado só será preciso usar mais uma linha, muito fácil, não é mesmo?
Conclusão a respeito do RegEx com Python
Se você chegou até aqui certamente podemos concluir que você dominou o uso do RegEx com Python!
Você está ciente de todos os principais métodos de utilização das Expressões Regulares nesta maravilhosa linguagem de programação e aprendeu com exemplos práticos como fazer uso de tais métodos. Agora é hora de colocar em prática o que você aprendeu.
Não se esqueça de nos seguir nas redes sociais para receber diversos outros conteúdos e assinar nossa NewsLetter para não perder nada.