Escolha as suas palavras: uma introdução às expressões regulares e ao seu entendimento.

Neste artigo é apresentado uma introdução às principais expressões regulares e ao seu funcionamento.

Clébio de Oliveira Júnior
Datarisk.io
8 min readApr 13, 2022

--

Photo by Brett Jordan on Unsplash

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.

Figura 1 — Imagem apresenta os caracteres que são utilizados como exemplo para explicação de cada expressão regular. Os pontos em cinza representam espaços, enquanto que as setas também em cinza mostram que há uma nova linha.

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.

Figura 2 — Na imagem são mostrados os caracteres encontrados como padrão da expressão regular . (ponto) por meio de quadrados em diferentes tons de azul. Esta expressão regular encontra qualquer caractere como padrão.

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.

Figura 3 — É mostrado o padrão encontrado pela expressão regular ^. (acento circunflexo e ponto). O padrão encontrado é qualquer tipo de caractere que se encontre no início da frase demonstrados pelos quadrados azuis.

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.

Figura 4 — Na figura é mostrado o padrão encontrado pela expressão regular .$ (ponto e cifrão). Os padrões encontrados foram qualquer tipo de caractere que se encontre no final da frase. Os resultados são destacados por quadrados em diferentes 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.

Figura 5 — Na figura são demonstrados os padrões encontrados pela regex ro* (“r”, “o” e asterisco) em tons de azul. O padrão encontrado são as letras “r” com ou sem a letra “o”, pois o asterisco associa a ocorrência de nenhum ou quantas forem possíveis.

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.

Figura 6 — Na figura são demonstrados os caracteres encontrados pela regex \d+ (contra-barra, d e +). Os padrões destacados, em tons de azul, foram as ocorrências de pelo menos um ou mais números.

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.

Figura 7 — A figura mostra os padrões da regex ,0? (vírgula, número 0 e o sinal de interrogação) encontrados em diferentes tons de azul. Esta expressão destaca a vírgula com ou sem o número associado a ela por causa do sinal de mais.

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.

Figura 8 — A figura mostra o padrão encontrado pela regex \d{4,5}, que destaca uma sequência de números que podem variar de 4 a 5 vezes. Limites esses impostos pela expressão {4,5}. Os padrões encontrados pela expressão regular estão destacados por diferentes tons de azul.

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.

Figura 9 — A figura mostra o resultado da expressão regular [ab], que encontra como padrão a letra “a”, “b” e a sílaba “ab”. Os resultados da aplicação desta expressão são destacados em tons de azul.

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.

Figura 10 — É demonstrado o resultado da regex de negação [^ab]. Portanto excluindo as letras “a”, “b” e a combinação das duas. Os resultados são destacados por meio de 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.

Figura 11 — A figura mostra, destacados em diferentes tons de azul, os resultados encontrados pela expressão [0–9], que visa encontrar todos o números.

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.

Figura 12 — A figura mostra os resultados encontrados pela expressão regular [Tt]e|or. O padrão encontrado é “Te”, “te” e “or” que estão sendo representados por diferentes tons de azul.

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.

Figura 13 — A figura mostra os destaques em tons de verde, laranja e roxo os diferentes grupos definidos pela expressão regular ([0–9]+)-([0–9]+)-([0–9]+). Expressão que visa destacar respectivamente o dia, o mês e o ano de uma data.

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.

Figura 14 — A figura destaca por meio da cor azul somente o caractere “$”. Isto acontece porque a expressão \ (contra-barra) cancela qualquer representação que a regex $ (cifrão) pode vir a ter. Então a expressão regular aplicada foi \$.

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.

Figura 15 — Os resultados da expressão \w que destaca em azul todos os caracteres que possam vir fazer parte de alguma frase de um idioma. Por isso destacando tanto números quanto letras.

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.

Referencias

  • 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.

--

--