REGEX e Python para automação de tarefas

Leandro Cruvinel
4 min readOct 20, 2020

--

Photo by Raphael Schaller on Unsplash

REGEX ou expressões regulares são códigos para localizar, extrair ou substituir partes desejadas de um texto. Dessa forma, podemos automatizar várias tarefas do dia a dia.

Na internet, encontramos várias tabelas com esses códigos. No RegExr, além de uma tabela, há também a possibilidade de testar como seu REGEX age sobre algum texto.

Neste post, veremos três exemplos práticos facilmente solucionados com REGEX usando a linguagem Python.

Sumário

  • Extraindo e-mails
  • Ocultando dígitos de CPFs
  • Reordenando lista de nomes e e-mails

Extraindo e-mails

Na internet encontramos vários padrões para validação de e-mail. O padrão a seguir é bem simples, mas contempla todos os e-mails da nossa lista.

[a-zA-Z_\d\.]+@[a-zA-Z_\d]+\.com(?:\.br){0,1}

Basicamente, o padrão nos fala que antes do caracter @ aceitamos letras minúsculas, maiúsculas, underline, dígitos ou pontos. Após o arroba e antes do .com aceitamos letras minúsculas, maiúsculas, underline e dígitos. Após o .com pode ou não haver .br

Observe que o padrão não é geral, uma vez que o e-mail pode vir com abreviações de outros países, por exemplo, .us

Para um REGEX mais geral, que contemple todos os países, podemos utilizar o padrão abaixo:

[a-zA-Z_\d\.]+@[a-zA-Z_\d]+\.com(?:\.\w\w){0,1}

Utilizaremos alguns e-mails aleatórios gerados com a biblioteca faker.js do node. Nessa lista de e-mails fictícios acrescentamos .us no segundo e .br no antepenúltimo. Isso tornará o exemplo mais completo.

Para aplicar nosso REGEX usando Python na lista de e-mails geradas pela fake.js utilizamos o código a seguir:

Sucesso! Fomos capazes de capturar todos os e-mails da lista de forma correta. Para um outro padrão de REGEX para captura de e-mails, ainda mais geral, clique aqui.

Ocultando dígitos de CPFs

O problema agora é o seguinte, nosso chefe quer que todos os CPFs que apareceram no relatório tenham seus 6 primeiros dígitos substituídos por asteriscos.

O REGEX para capturar um CPF com máscara é bem simples:

\d{3}\.\d{3}\.\d{3}\-\d{2}

Observe que temos 3 dígitos, seguido de ponto, seguido de 3 dígitos, seguido de ponto, seguido de mais 3 dígitos, seguido de hífen, seguido por mais 2 dígitos.

Como pretendemos fazer uma substituição, agruparemos a parte que não será substituída, usando parênteses:

\d{3}\.\d{3}(\.\d{3}\-\d{2})

Usamos \g<1> quando quisermos fazer referência ao grupo 1. O código em Python para fazer a substituição é o seguinte:

Observe que, ao utilizarmos o método sub da biblioteca re, mantemos o grupo sem alteração. Os CPFs do exemplo foram gerados pela biblioteca faker.js.

Reordenando lista de nomes e e-mails

Suponha agora que temos um arquivo de nome emails.txt com o seguinte conteúdo:

Nosso chefe, muito detalhista, pediu para que os nomes venham antes dos e-mails. Precisaríamos refazer toda lista… se não fosse REGEX e Python!

Primeiro, vamos ler o arquivo e colocar numa lista chamada texts:

f = open("emails.txt", "r")
texts = f.readlines()
f.close()

Criaremos um REGEX com dois grupos, o primeiro para capturar os e-mails e o segundo para capturar os nomes:

import re
pattern = re.compile(r"([\w]+@[\w]+.com)\s([A-Za-z\s]+)\n")

Lembre-se que para definir um grupo, basta colocar parênteses no código que representa o grupo no REGEX. Neste caso definimos dois grupos.

Substituiremos o primeiro grupo pelo segundo grupo:

new_texts = [
re.sub(pattern, "\g<2> \g<1>\n", old_text) for old_text in texts
]

Agora basta criar o arquivo de nome fixed_emails.txt com os resultados obtidos:

g = open("fixed_emails.txt", "w")
for new_text in new_texts:
g.write(new_text)
g.close()

O código completo fica:

E o arquivo fixed_emails.txt fica:

E isso é tudo!

Conclusão

Neste post vimos exemplos de problemas reais que podem ser resolvidos com REGEX e Python. Para isso, utilizamos algumas técnicas:

  • Localização de padrões
  • Substituição de padrões
  • Substituições de padrões fora de grupos
  • Substituições entre grupos

Espero que tenham se divertido, até a próxima! \(ᵔᵕᵔ)/

--

--

Leandro Cruvinel
Leandro Cruvinel

Written by Leandro Cruvinel

Math Professor | Data Scientist | Web developer

No responses yet