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
(cadax
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.
Se escreve caracter/caráter/caracteres?
Enjoy!
Top comments (1)
Nossa, adorei esse caso de uso!
Gostei muito que tu criou uma expressão bem simples que já seria capaz de resolver o problema e ai foi refinando essa expressão pra aplicar mais conceitos das expressões regulares.
Regex é com certeza um conteúdo extremamente interessante, e que muitas vezes acaba não recebendo a devida atenção.