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?
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..