REGEX e Python para automação de tarefas
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! \(ᵔᵕᵔ)/