5
respostas

O modelo não funciona para números de celulares

Ao digitar um número de telefone celular, por exemplo 5521981524578, o padrão do Regex não funciona, pois considera o código do país como 552, daí imprime a seguinte formatação: +552(19)8152-4578. O que poderia ser feito para que funcionasse?

5 respostas

Olá Glleddson, parece que a máscara está buscando o número "antigo" sem o 9 então tem que alterar a máscara de captura. Se puder compartilhar o código posso ajudar.

Faaala aí Glleddson, tudo tranquilo?

Muito bem observado sua dúvida. Hoje em dia todos os telefones celulares do Brasil tem 9 dígitos. E os telefones fixos possuem 8 dígitos. Então pensando no cenário brasileiro temos casos como:

  • 55 31 98767 3845 (celulares)
  • 55 31 3867 2312 (fixos)

Mas como citado pelo professor, alguns países não possuem 2 dígitos no código de área, mas sim 3. E neste casos, irá variar muito se eles possuem ou não o nono dígito nos celulares. Então temos casos de:

  • 155 23 8756 3223 (celulares)
  • 155 45 98765 1234 (celulares)
  • 155 45 8764 1343 (fixos)

Tudo tranquilo até aqui ?

Pois bem, na regex padrão que o professor disponibiliza, podemos fazer uma mudança sutil para que possamos encontrar todos estes padrões acima citados sem ocorrer o problema que você mencionou.

Podemos pedir o usuário para digitar o número com parênteses no ddd, pois, assim iremos conseguir saber se o código de área começa com 2 ou 3 dígitos. Deixo abaixo um exemplo:

import re

telefone = "55(21)981524578"
padrao = "([0-9]{2,3})?(\([0-9]{2}\))([0-9]{4,5})([0-9]{4})"
resposta = re.search(padrao, telefone)
numero_formatado = "+{}{}{}-{}".format(
            resposta.group(1),resposta.group(2),resposta.group(3),
            resposta.group(4)
)
print(numero_formatado)

A mudança foi apenas escapar o parênteses: (\([0-9]{2}\)), pegando assim o seu valor real e não como um grupo de captura.

Faça os testes :D

Vale ressaltar que nossa regex ainda tem muito a ser melhorada ainda para que alcancemos uma validação completa, pois, imagine os seguintes casos:

  • números de 0800
  • e se o usuário colocar algum ddd ou número de telefone que comece com 0?

Mas o objetivo da aula foi nos dar um aperitivo do poder que as expressões regulares possuem. Portanto, deixo aqui alguns artigos que podem te ajudar a melhorar ainda mais esta regex e praticar:

E por fim, um curso aqui da alura sobre o assunto.

Lembrando que sempre que vamos construir uma regex temos que pensar em nosso padrão, no alvo que queremos atingir e todo resto diferente daquilo será descartado. Mas tenha cautela, pois isto se aplica caso seus dados sejam bem definidos. Beleza??!!!

Qualquer dúvida estou a disposição. Espero ter ajudado. Bons estudos!!!

Resposta muito boa! Obrigado! Para não obrigarmos a digitação do parênteses, eu havia pensado em fixarmos, também, os códigos DDDs nacionais. Mas, pode acontecer de aparecerem outros códigos e o programa apresentar um bug.

Glleddson, sua ideia de pensar em casos que poderiam gerar um bug no seu código está certinha, é isto mesmo, é importante que pense nisto, pois, nem sempre teremos dados bem definidos. Quando temos várias possibilidades assim, como é o nosso caso, pois veja:

  • números celulares nacionais
  • números fixos nacionais
  • números de 0800
  • números que podem vir com parênteses no ddd ou não
  • números de emergência como por exemplo o 190

Pode ser que seja interessante quebrar o problema em partes, pois, a regex tende a ficar complexa abrangendo este todo, daí, caso ele não encontre nenhum dos padrões, retornamos false.

Tu está no caminho certo. Qualquer dúvida fique a vontade para postar no fórum. Espero ter ajudado. Bons estudos!!!

Glleddson, no caso da dúvida o ideal seria criar uma estrutura de decisão, antes de realizar a formatação; perguntas como é: Qual é o país, Fixo ou Celular etc..

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software