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?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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?
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:
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:
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:
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:
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..