Durante o trabalho de um profissional de dados, uma das etapas que mais demanda tempo é a de preparação dos mesmos. Isso pode ocorrer para cientistas que precisam limpar “sujeiras” ou corrigir a formatação da base de dados, como também para os engenheiros que realizam a extração, transformação e carregamento; processo também conhecido como ETL (do inglês Extraction, Transformation and Loading). Assim, tornando as expressões regulares ou regex — como também são conhecidas — uma excelente ferramenta no kit de qualquer profissional deste setor, pois elas conseguem selecionar os padrões, que são ou não desejáveis, e aplicar ações por meio de linguagens de programação de exclusão, seleção e etc.
Neste post, apresentaremos algumas das principais expressões regulares, juntamente com exemplos do que cada uma busca como padrão.
Expressões Regulares
Uma expressão regular é um grupo de caracteres que ao ser utilizado sozinho ou em conjunto pode representar algum tipo de padrão dentro de um texto, frase ou palavra. Podendo ser uma repetição de letras, números ou um conjunto de símbolos. Para um melhor entendimento, abaixo são apresentados as principais expressões regulares juntamente com uma explicação de seu funcionamento e imagens que mostram o padrão encontrado por elas.
Na Figura 1 é apresentada as sentenças que são utilizadas para exemplificar cada expressão regular, onde os círculos cinzas são espaços vazios, enquanto que as setas representam novas linhas. Convido o leitor a escrever estas frases no site regex101, para realizar os mesmos procedimentos descritos no post e ter uma experiência em tempo real e de melhor entendimento do padrão encontrado.

Ponto
O ponto (.) representa qualquer caractere, menos uma nova linha. Ao Aplicar o ponto nos caracteres da Figura 1, são selecionados todos os caracteres em tons de azul, sejam eles letras, números, vírgulas, dentre outros. O resultado é demonstrado na Figura 2.

Circunflexo
O sinal de circunflexo (^) sinaliza que o padrão descoberto pela expressão regular encontra-se no início das frases. Por exemplo, ao aplicar ^. (circunflexo e ponto) nas sentenças da Figura 1, obtém-se como resultado qualquer caractere que se encontre no começo das strings. Os resultados são destacados em diferentes tons de azul e mostrados na Figura 3.

Cifrão
O caractere cifrão ($) atua de forma parecida à expressão circunflexo, porém com a diferença que esta expressão faz referência ao final da string. Utilizando a mesma ideia do padrão da Figura 3 como exemplo. O .$ (ponto e cifrão) seleciona todos os caracteres que estejam ao final de cada sentença da Figura 1. O resultado é observado na Figura 4 em que somente os últimos caracteres foram destacados em tons de azul.

Asterisco
O asterisco (*) faz referência a repetições de zero ocorrências ou a tantas quanto forem possíveis do caractere associado a ele. Para exemplificação é utilizada a expressão regular ro*, que visa selecionar a letra “r” com nenhuma, uma ou quantas forem possíveis repetições da letra “o”. Os resultados da expressão regular aplicada na Figura 1, são demonstrados através de diferentes tons de azul na Figura 5.

Mais
O sinal de soma (+) funciona de forma parecida ao do asterisco (*). O diferencial é que + encontra como padrão a repetição de uma ou mais vezes. Ao empregar a expressão regular d+ (contra-barra, letra d e sinal de soma), no qual d significa basicamente qualquer caractere numérico, é possível encontrar a ocorrência de um ou mais números em sequência. Ao aplicá-la nas frases da Figura 1, todos os números são destacados através de diferentes tons de azul como é apresentado na Figura 6.

Interrogação
O sinal de interrogação (?) faz referência a nenhuma ou no máximo uma ocorrência do caractere que estiver a sua esquerda. Portanto, agindo de forma parecida com + (sinal de soma), mas com o limite máximo de apenas uma ocorrência. Para exemplificar é abordada a expressão regular ,0? (vírgula, número 0 e sinal de interrogação). Ao utilizar esta regex nas frases da Figura 1, é destacado apenas o caractere vírgula (,) e ele associado ao número zero como demonstrado na Figura 7.

Chaves
O par de chaves realiza a identificação de caracteres que se repetem por um número definido de vezes. Estes limites são definidos dentro das chaves pelas letras m, que é o limite inferior, e n, que é o limite superior. Ficando desta maneira {m,n} a estrutura da expressão regular . Para lição, é utilizada a expressão d{4,5}, no qual tem como objetivo encontrar números que se repetem de 4 a 5 vezes. Ao aplicar nas frases da Figura 1 as sequências de número que variam de 4 a 5 são destacadas em diferentes tons de azul, como demonstrado na Figura 8.

Colchetes
O par de colchetes ([ ]) são utilizados para definir uma lista de caracteres para serem selecionados como padrão. Desse modo, ao colocar as letras “a” e “b”, por exemplo, dentro dos colchetes [ab], o padrão selecionado será “a”, “b”, “ab” ou “ba”. Ao usar esta expressão regular nas sentenças da Figura 1, encontramos como resultado os destaques “a”, “b” e “ab” em quadrados com tons de azul da Figura 9.

Além disso, uma outra utilidade das listas é a negação de uma lista de caracteres. Para isso, coloca-se o acento circunflexo (^) como primeiro membro da lista. Assim, para negarmos a lista do exemplo anterior é necessário adicionar o acento circunflexo no começo da lista, resultando em [^ab]. Logo, todos os caracteres são selecionados exceto “a”, “b”, “ba” ou “ab”. O resultado da expressão aplicada as sentenças da Figura 1 é observado na Figura 10, com os destaques do resultado em diferentes tons de azul.

Um outro caractere usado é o – (traço). Ele é aplicado para colocar um alcance de letras ou números em sequência. Por exemplo, é possível selecionar todas as letras em sequência tanto maiúsculas quanto minúsculas com a expressão [a-zA-Z]. Não precisando colocar letra por letra dentro dos colchetes. O mesmo acontece para uma sequência de números que segue o mesmo princípio [0-9]. O resultado da aplicação desta última expressão nas frases da Figura 1 pode ser observador na Figura 11, onde todos os números são selecionados.

Barra na Vertical
A barra na vertical (|) — também conhecida como pipe — funciona como um “ou” entre duas ou mais expressões regulares. Portanto o padrão encontrado é um conjunto de padrões de duas ou mais expressões regulares. Para demonstração é utilizada a expressão [Tt]e|or, que possibilita encontrar as expressões “Te”, “te” ou “or”. Os resultados destacados em diferentes tons de azul desta expressão regular nas frases da Figura 1, podem ser observados na Figura 12.

Parênteses
Os parênteses (( )) definem um grupo que contém um padrão da expressão regular. As bibliotecas da linguagem Python utilizam muito este recurso para definir o início e o fim de um grupo de expressões, que são selecionadas em um determinado grupo para uma ação específica. Na expressão regular ([0-9]+)-([0-9]+)-([0-9]+) há três grupos que selecionam respectivamente o ano, o mês e o dia dentro deste formato de data separados por barras. Os resultados desta expressão aplicadas nas sentenças da Figura 1 são mostrados na Figura 13, onde as cores verde, laranja e roxo diferenciam os grupos.

Contra-barra
Dentro das expressões regulares a (contra-barra) tem diferentes papéis. Um de seus principais é a possibilidade de escapar algum caractere que inicialmente seja utilizado para encontrar algum tipo de padrão, como por exemplo o $ (cifrão). Quando deseja-se selecionar somente este e não fazer referência ao final da frase, adiciona-se a ao seu lado direito $ (contra-barra e cifrão). Desta maneira, só o que é selecionado é o caractere “$” como demonstrado na Figura 14 em azul. O mesmo ocorre para as demais expressões (, ), [, ], ., + e dentre outros.

Um outro uso de contra-barra é a sua associação a letras para significar um conjunto de caractere específico. Dentre esses estão o d que significa um conjunto de números, por consequência esta expressão tem o mesmo significado da regex [0-9]. Enquanto que w possui a mesma função da expressão [a-zA-Z0-9_], onde são selecionadas qualquer caractere que possa fazer parte de alguma frase, em qualquer idioma juntamente com o sublinhado. Na Figura 15 observa-se em tons de azul os padrão desta expressão na Figura 1.

Além desses existem outros como por exemplo o s e a sua versão maiúscula S. Este primeiro faz referência a espaços vazios, enquanto que a sua versão maiúscula seleciona qualquer caractere menos os espaços vazios. De forma similar funciona W, que é o contrário de w, que nega todas as letras que podem fazer parte de alguma frase de idioma funcionando como a expressão regular [^a-zA-Z0-9_]. Além desses existem outros exemplos que podem ser acessados por meio da página do Python sobre expressões regulares.
Conclusão
As expressões regulares representam um padrão que pode ser encontrado dentro de frases, textos ou dados em geral. Esta ferramenta em combinação com uma linguagem de programação como o Python possibilita a limpeza, substituição ou concerto dos dados, depende do problema a ser resolvido.
Caso o leitor queira saber mais sobre as expressões e ter mais exemplos de aplicabilidade, recomendo a leitura da documentação do Python e do livro “Expressões Regulares: Uma Abordagem Divertida”. Todas essas referências encontram-se abaixo juntamente com o link do site Regex Expression 101 para prática.
Acesse o site da Datarisk e descubra como podemos gerar mais valor para sua empresa.
Referências
- Python Software Foundation. re — Operações com expressões regulares. Disponível em: <https://docs.python.org/pt-br/3/library/re.html>. Acesso em: 18 de fevereiro de 2022.
- JARGAS, Aurélio Marinho. Expressões Regulares: Uma Abordagem Divertida. 5º edição. São Paulo — SP: Novatec Editora Ltda., 2016.
- Regex Expressions 101. Regular Expression. Disponível em: <https://regex101.com/>. Acesso em: 19 de fevereiro de 2022.

Cientista de dados