Manipulando grupos em REGEX com Python

Leandro Cruvinel
6 min readAug 25, 2021

--

Many wood letters
Photo by Amador Loureiro on Unsplash

Regex é uma abreviação para expressões regulares. Na prática são expressões que representam padrões, formatos, máscaras ou características de um texto. Por exemplo, reconhecemos um e-mail pela presença do @. Esse é um padrão encontrado em e-mails. É possível com Regex e Python definir esses padrões para buscas, substituições ou verificações de conformidade.

Este post entrará um pouco mais fundo em Regex estudando grupos dentro de uma expressão regular. Caso seja o primeiro contato do leitor com Regex, sugiro uma leitura mais leve clicando aqui.

Este post está dividido nas seguintes partes:

  1. Definição de expressões regulares com grupos
  2. Substituições de grupos em expressões regulares
  3. Substituições de grupos em expressões regulares usando funções

Definição de expressões regulares com grupos

Um grupo é parte de uma expressão regular. Podemos identificar o grupo na expressão colocando-o entre parenteses.

Vejamos um exemplo: Seu chefe tem um texto com vários CPF’s e PIS/PASEP e deseja substituir do 4º ao 9º dígito de cada CPF no texto por asteriscos (*). Note que não podemos alterar os números de PIS/PASEP, apenas os de CPF’s.

Supomos um texto como o seguinte:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec laoreet magna at tortor imperdiet 385.749.880-30 porttitor. Curabitur eu metus vehicula lacus vestibulum tempor. Sed odio turpis, convallis et neque facilisis, malesuada luctus ex. Class aptent taciti sociosqu 994.59160.73-6 ad litora torquent per conubia nostra, per 475.85417.87-0 inceptos himenaeos. Pellentesque lacinia purus id leo consectetur, nec dignissim metus imperdiet. Maecenas ac leo imperdiet, porttitor 531.130.990-30 neque sed, dictum augue. Ut ac augue orci.

Os números acima foram gerados no site https://www.4devs.com.br/ e o texto foi gerado no site https://www.lipsum.com/

A expressão regular que representa um CPF é dada por

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

onde \d indica um dígito e {n} logo em seguida significa que o mesmo aparecerá n vezes. O ponto é representado por \. e o hífen por \- completando a expressão regular.

Abaixo temos um código em Python que encontra os CPF’s no texto e imprime estes no console, usando a expressão regular acima.

O resultado obtido é o seguinte:

[‘385.749.880–30’, ‘531.130.990–30’].

Observe que, até aqui, já temos bons resultados práticos, pois conseguimos encontrar os CPF’s que estão no texto. Apesar dos números de PIS/PASEP também estarem lá, estes foram ignorados como esperado, pois não seguiam o padrão da expressão regular definida.

Como o objetivo é substituir do 4º ao 9º dígito dos CPF’s por asteriscos, faremos grupos para identificar as partes de interesse na expressão regular:

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

Cada parte da expressão regular entre um par de parênteses é chamada de grupo. Estes grupos são referenciados de forma numérica e ordenada.

A parte de interesse está entre o segundo par de parênteses. Sendo assim, a parte que substituiremos por asteriscos corresponde ao grupo 2.

Utilizando agora a expressão regular com grupos, o resultado no console muda um pouquinho:

[('385.', '749.880', '-30'), ('531.', '130.990', '-30')]

Observe que, dessa vez, temos os CPF’s que estão no texto em tuplas com cada iterável correspondendo ao respectivo grupo.

Substituições de grupos em expressões regulares

O código para substituição no grupo 2 segue abaixo:

O novo texto será:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec laoreet magna at tortor imperdiet 385.***.***-30 porttitor. Curabitur eu metus vehicula lacus vestibulum tempor. Sed odio turpis, convallis et neque facilisis, malesuada luctus ex. Class aptent taciti sociosqu 994.59160.73-6 ad litora torquent per conubia nostra, per 475.85417.87-0 inceptos himenaeos. Pellentesque lacinia purus id leo consectetur, nec dignissim metus imperdiet. Maecenas ac leo imperdiet, porttitor 531.***.***-30 neque sed, dictum augue. Ut ac augue orci.

No texto, observamos que os dígitos do 4º ao 9º dos CPF’s foram trocados por asteriscos.

Hora de entender melhor como essa mágica acontece! Nada melhor e mais didático que uma imagem toda colorida:

Os parênteses definiram qual grupo corresponde a qual parte do CPF. O grupo i é referenciado por \g<i>, i=1,2,3. Observe que o grupo 2 não é substituído, apenas é omitido, por isso a cor branca, e não a cor laranja.

No exemplo os grupos foram, ou mantidos, ou omitidos. Seria possível, ainda, trocá-los de lugar usando, por exemplo, o seguinte padrão de substituição:

\g<3>***.***\g<1>

Pensando em estrutura de dados, cada grupo é uma string. Logo, seria muito interessante usar métodos de strings para manipulá-los de maneira mais personalizada!

Na próxima seção veremos um exemplo para contextualizar este problema.

Substituições de grupos em expressões regulares usando funções

Considere o seguinte problema: Seu chefe ficou sabendo que não era necessário colocar asteriscos em todos os dígitos do 4º ao 9º dos CPF’s, mas apenas nos dígitos do 4º ao 9º que são pares.

E agora? O que muda? Como podemos trabalhar esse novo problema?

Dessa vez teremos que mexer no grupo 2 e, diferentemente do exemplo anterior, não basta apenas omiti-lo.

Utilizaremos uma função auxiliar que troca caracteres numéricos pares de um texto por asterisco:

O nosso próximo passo é utilizar a função auxiliar para substituir os dígitos pares do grupo 2 por asteriscos. Para ter uma melhor ideia do que está acontecendo, outra imagem toda colorida! ♥‿♥

Precisamos de uma segunda função que fará o papel das setas na imagem acima. Chamaremos a função de altera_grupo_2:

No retorno da função observe que mantemos o grupo 1, depois trocamos os pares por asteriscos do grupo 2 e, por fim, mantemos o grupo 3.

Agora sim, podemos ver o código completo:

O resultado impresso no terminal será o seguinte:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec laoreet magna at tortor imperdiet 385.7*9.***-30 porttitor. Curabitur eu metus vehicula lacus vestibulum tempor. Sed odio turpis, convallis et neque facilisis, malesuada luctus ex. Class aptent taciti sociosqu 994.59160.73–6 ad litora torquent per conubia nostra, per 475.85417.87–0 inceptos himenaeos. Pellentesque lacinia purus id leo consectetur, nec dignissim metus imperdiet. Maecenas ac leo imperdiet, porttitor 531.13*.99*-30 neque sed, dictum augue. Ut ac augue orci.

A diferença aqui é que, ao invés de passar como segundo parâmetro da função re.sub uma string, passamos a função que faz a alterção (altera_grupo_2).

Como esperado, apenas os números pares dos CPF’s do 4º ao 9º dígito foram substituídos por asteriscos.

Missão completa! Podemos ir para casa mais cedo hoje!

Conclusão

Os problemas aqui apresentados são hipotéticos e talvez ninguém no mundo usará, na vida real, grupos de expressões regulares para substituir números pares do 4º ao 9º dígito de CPF’s no texto! ¯\_(ツ)_/¯

Mas… a intenção é entender como definir e manipular os grupos em expressões regulares na prática e com um problema simples.

Com certeza, se você trabalha muito com textos, uma hora vai se deparar com problema parecido e poderá utilizar adaptações das estratégias aqui apresentadas para evitar grandes dores de cabeça.

Espero que tenham gostado!

Até a próxima… (ᵔᵕᵔ)/

--

--

Leandro Cruvinel
Leandro Cruvinel

Written by Leandro Cruvinel

Math Professor | Data Scientist | Web developer

No responses yet