photo by Drahomír Posteby-Mach on Unsplash

Validando dados de usuários da biblioteca com Regex no Python

Francisco Foz
6 min readJun 14, 2022

O cadastro dos usuários em uma biblioteca é importante para que se tenha informações únicas de cada um.

Informações básicas de contato como telefone e e-mail são importantes, para se houver necessidade, entrar em contato ou se permitirem, enviar comunicações de marketing da unidade.

Mas nem sempre o cadastro está correto e isso pode gerar um problema de falta de comunicação.

Podemos criar uma forma automática de validar os números de telefone celular com Python. Para que desta forma, possamos entender quais são os inválidos e a direção da biblioteca montar um plano de ação para corrigir.

Neste texto mostrarei como.

Borá la?!

Sumário

Conjuntos de dados

Expressões regulares — Regex

Classe validadora

Suporte da comunidade

Considerações finais

Conjuntos de dados

Além do conjunto de dados do cadastro de usuários da biblioteca foram disponibilizados mais 2 conjuntos: das matrículas da universidade e do cadastro inicial do comercial.

Biblioteca:

Matrícula:

Comercial:

Isso exemplifica um cenário real, onde os sistemas são dispersos e ainda não possuem uma integração.

Após verificar quais são os números inválidos no cadastro da biblioteca, poderemos conferir no conjunto das matrículas da universidade e no cadastro inicial do comercial.

Os dados estão disponíveis e você pode conferir eles aqui no Kaggle.

Expressões regulares — Regex

Para validar dados de acordo com um padrão estabelecido, nós podemos utilizar Expressões Regulares ou Regex (abreviação de regular expression).

É um padrão de identificação de caracteres independente de linguagem (Python, Javascript, C, Java, PHP…).

É extremamente poderoso e te permite fazer muitos usos.

Mas pode assustar no começo, pois parece uma linguagem alienígena:

Confira esse artigo dos principais uso de Regex para tratamento de dados

Realmente é estranho, mas acredito que vale a pena estudar para explorar suas aplicações.

Você também pode ir treinando utilizando esse site, que te permite testar as verificações dos caracteres.

Link

Para esse projeto utilizarei duas validações:

  1. Validando o padrão do celular no Brasil:
‘[1–9]{2}9[5–9]{1}[0–9]{7}’

Nesse caso, estou delimitando que os 2 primeiros caracteres (dentro das chaves{}) possuirão dígitos de 1 a 9, o DDD.

Seguido do dígito 9 , um dígito entre 5 a 9 e de uma sequência de 7 dígitos entre 0 a 9.

Estando dentro desse padrão, passo por uma segunda validação.

2. Validando repetições do número de celular:

‘0{6}|1{6}|2{6}|3{6}|4{6}|5{6}|6{6}|7{6}|8{6}|9{6}’

Nesse caso, estou verificando se esse número possui alguma repetição de qualquer dígito entre 0 e 9 de pelo menos 6 vezes.

Para evitar aquelas entradas de 1111111111, sabe?

Estando tudo ok, o número de celular está validado.

Classe validadora

Para criar um mecanismo de validação do número de celular, criei uma classe CelularBR, no qual ao fazer as validações ela me retornará o número formatado: (xx) xxxxx-xxxx ou a frase “Número inválido”.

import reclass CelularBr:
"""
Esta classe irá validar o número de celular, retornando-o
no formato padrão do Brasil: (xx) xxxxx-xxxx.
Caso o número não seja válido, retornará a mensagem:
"Número inválido"
"""
def __init__(self, celular):
self.celular = str(celular)
def verifica_validacao(self):
"""
Esta função irá verificar a validação do número retornado,
pela função valida_celular.
Se for válido, ela formatará nopadrão da formata_celular,
se não for imprimirá "Número inválido"
"""
if self.valida_celular(self.celular):
return self.formata_numero()
else:
return "Número inválido"
def valida_celular(self, celular):
"""
Esta função irá validar (com Regex) o número de celular
com o DDD.
Retornando True ou False.
"""
padrao = '[1-9]{2}9[5-9]{1}[0-9]{7}'
primeira_validacao = re.findall(padrao, celular)
if primeira_validacao:
segundo_padrao = '0{6}|1{6}|2{6}|3{6}|4{6}|5{6}|6{6}|7{6}|8{6}|9{6}'
segunda_validacao = re.findall(segundo_padrao,
primeira_validacao[0])
if segunda_validacao:
return False
else:
return True
else:
return False
def formata_numero(self):
"""
Esta função retornará o o número formatado no padrão:
(xx) xxxxx-xxxx.
"""
padrao = '([1-9]{2})(9[0-9]{4})([0-9]{4})'
resposta = re.search(padrao, self.celular)
ddd = resposta.group(1)
primeiros_digitos = resposta.group(2)
ultimos_digitos = resposta.group(3)
numero_formatado = (f"({ddd}) {primeiros_digitos}- {ultimos_digitos}")
return numero_formatado

Quando começamos a estudar ciência de dados, pode ser que a princípio não utilizemos tanto o paradigma da orientação a objetos, mas conforme vamos dando os primeiros passos ela se torna essencial para a resolução dos problemas.

Classe criada, apenas agora faço a validação para cada número de telefone.

Importo para meu notebook:

import celularBr as c

Faço a validação, usando uma função anônima (lambda):

biblioteca['TELEFONE_VALIDADO'] = biblioteca['TELEFONE'].apply(lambda celular: c.CelularBr(celular).verifica_validacao())

e…

Logo mais a frente explicarei porque usei a função anônima.

Após esse procedimento, filtrei apenas os que foram inválidos e verifiquei na tabela de matrículas e na do comercial e ao final, 22 usuários estavam com problemas no cadastro do telefone.

O 22 aqui não é tão importante, mas sim o processo de exaurir as fontes de dados para que você possa buscar outras soluções para o problema.

Desta forma a direção da biblioteca poderá montar um plano de ação, de acordo com o contexto da unidade para verificar o cadastro destes usuários e também criar mecanismos de validação nos formulários de entrada dos sistemas.

Suporte da comunidade

Ao se estudar programação é bem provável de você não conseguir entender tudo de início ou mesmo precisar de algum empurrão.

Você pode recorrer a perguntas no Stackoverflow, como pesquisei essa aqui.

Como também pode recorrer a fóruns, comunidades no Discord, colegas de trabalho, de estudo…

Eu estava travado no desenvolvimento da classe validadora e precisei solicitar auxílio no fórum do curso que realizei e logo veio a resposta.

Não tenha vergonha ou se sinta menor, todas as pessoas passam por isso e é bem comum. O certo é você perguntar e encontrar a solução.

É o seu processo de aprendizagem.

E por isso usei a função anônima, pela indicação no fórum, pois a princípio utilizaria uma compreensão de lista e…

Ela não é tão performática quando a lambda.

Conforme trouxeram nesse texto e eu mesmo fiz o teste:

import timeitinicio = time.time()
[CelularBr(numero).verifica_validacao() for numero in biblioteca['TELEFONE']]
fim = time.time()
print(fim - inicio)
0.0429384708404541inicio = time.time()
biblioteca['TELEFONE'].apply(lambda celular: CelularBr(celular).verifica_validacao())
fim = time.time()
print(fim - inicio)
0.0131108760833740230.0429384708404541/0.0131108760833740233.275026822570966

No caso em específico, ela foi 3,27 vezes mais rápida!

Considerações finais

A validação de dados é uma forma de se garantir a sua acuracidade. O ideal é que ela seja realizada no “input” (entrada) dos dados, entretanto nem sempre é a realidade e é necessário realizar uma validação nos dados já preenchidos (como foi o caso desse projeto).

Você pode conferir o projeto inteiro aqui.

O que aprendi criando esse projeto, foi devido a esse curso da Alura:

Link do curso

E se caso você se interessar em aprofundar no estudos de expressões regulares, a Alura também tem esse em específico:

Link do curso

Caso você não seja aluno ainda, confira meu cupom de desconto especial aqui.

Pode ser que não tenha sido a melhor escolha de Regex, mas solucionou a princípio o problema.

E você… conhece outras formas de validação com Regex? Compartilhe nos comentários e vamos conversar mais.

Se você chegou até aqui e curtiu, dê palmas, compartilhe e se inscreva para me acompanhar.

Ainda há muito a se explorar…

--

--

Francisco Foz
Francisco Foz

Written by Francisco Foz

Bibliotecário | Analista de dados | Disseminando informações para produzir conhecimento.

No responses yet