Caso de uso: RegEx

Podemos identificar padrões em uma cadeia de caracteres usando Expressões Regulares (Regular Expression ou RegEx).

Para validar o formato de um CPF, por exemplo, é necessário que esteja no seguinte padrão:

  • xxx.xxx.xxx-xx (cada x corresponde à um dígito decimal)

Então através de uma RegEx conseguimos identificar se esse padrão foi seguido ou não.

Introdução

Usando a linguagem de programação Python, importa-se o módulo re que fornece operações de expressões regulares.

import re

Cria-se uma função validar a qual recebe uma string cpf, ela retorna válido ou inválido.

def validar(cpf):
    validador = expressao.match(cpf)
    if validador:
        return 'válido'
    return 'inválido'

Primeiro caso

Usando a função re.match, compara-se o cpf com a expressão regular compilada expressao, ela retorna um Match Object caso combine, do contrário retorna None, o valor é atribuído à variável validador.

A expressão escrita a seguir contém alguns símbolos com significado especial, são eles:

  • ^ sinaliza o início de uma linha ou string
  • $ sinaliza o fim de uma linha ou string
  • \d corresponde aos dígitos decimais de 0 a 9

Um detalhe importante, o uso de . também possui um significado especial e para retirar esse significado usa-se a \ antes do caracter, assim ele se torna o . (ponto literal).

expressao = re.compile(r'^\d\d\d\.\d\d\d\.\d\d\d-\d\d$')

Essa expressão é escrita de uma forma simples, repetindo os caracteres no formato esperado.

Evitando repetição de elementos

Podemos reescrevê-la usando mais recursos implementados no módulo re, usando o conceito de repetição de elementos da RegEx representados por chaves {}, aplicando-o ao conjunto de dígitos \d que é repetido um certo número de vezes, obtem-se:

expressao = re.compile(r'^\d{3}\.\d{3}\.\d{3}-\d{2}$')

Evitando repetição de trechos

Outra forma de expressar a RegEx é usando o conceito de grupos. Nesse caso podemos agrupar um trecho do formato que se repete, fazendo um grupo de 3 dígitos e um . (ponto literal), que devem ser repetidos duas vezes.

expressao = re.compile(r'^(\d{3}\.){2}\d{3}-\d{2}$')

Exemplos de execução

Usaremos quatro exemplos para testar a validação do CPF:

a = '111.222.333-44'
b = '1234.123.789-88'
c = '123.12.789-88'
d = 'abs.ert.yui.lk'

print(f'''
    O CPF: {a} é {validar(a)}
    O CPF: {b} é {validar(b)}
    O CPF: {c} é {validar(c)}
    O CPF: {d} é {validar(d)}
    ''')

Analisando a saída obtida, notamos que:

  • O exemplo a está no formato correto.
  • O exemplo b contém mais dígitos do que o esperado no primeiro trecho.
  • O exemplo c contém menos dígitos do que o esperado no segundo trecho.
  • O exemplo d apresenta caracteres não-dígitos, sendo inválido.
O CPF: 111.222.333-44 é válido
    O CPF: 1234.123.789-88 é inválido
    O CPF: 1234.12.789-88 é inválido
    O CPF: abs.ert.yui.lk é inválido

Considerações

Vimos que uma RegEx pode ser escrita de várias formas para validar o mesmo padrão e ainda existem diversas outras maneiras, podendo levar em conta a legibilidade ou complexidade da escrita para fazer sua escolha.

Aprendendo mais sobre os recursos do módulo re do Python.

Estudando mais sobre expressões regulares.

Enjoy!

17