2
respostas

O código dá erro no telefone de nove dígitos - como corrigir?

import re

class Telefone_Br:

    def __init__(self, telefone):
        if self.valida_telefone(telefone):
            self.numero = telefone
        else:
            raise ValueError ('Telefone inválido.')

    def valida_telefone(self, telefone):
        padrao = '([0-9]{1,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})' # o ? diz que não é obrigatório
        resposta = re.findall(padrao, telefone)
        if resposta:
            return True
        else:
            return False


    def formata_telefone(self):
        padrao = '([0-9]{1,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})'
        resposta = re.search(padrao, self.numero)
        numero_formatado = '+{}({}){}-{}'.format(
            resposta.group(1),
            resposta.group(2),
            resposta.group(3),
            resposta.group(4)
        )

        print(numero_formatado)




from TelefoneBr import Telefone_Br

celular = '5521991234567'
celular_objeto = Telefone_Br(celular)
celular_objeto.formata_telefone()

SAÍDA

+552(19)9123-4567

Como fazer sair +55 (21) 99123-4567

LEMBRANDO: DDI é de 1 a 3 dígitos.

2 respostas

Oi Carolina, boa noite!

O padrão de regex utilizado acabou ficando ambiguo no DDI e na primeira parte do número de telefone. Nestas partes:

  • ([0-9]{1,3} (validação do DDI)
  • [0-9]{4,5} (validação da primeira parte do número de telefone) Isso dificulta o agrupamento correto das informações, pois abre margem para mais possibilidades de agrupamento.

Como o nome da sua classe é Telefone BR, então você deseja validar apenas telefones brasileiros, sendo assim, não é necessário deixar a validação do DDI aberta, você pode colocar pro DDI ter que ser sempre 55, que é o DDI do Brasil.

A nova regex ficaria: (55)?([0-9]{2})([0-9]{4,5})([0-9]{4})

Dessa forma você consegue validar tanto números de 8 digitos, quanto números de 9 dígitos corretamente.

Eu coloquei Br, mas fiquei pensando que poderia ter o cadastro de outros países. Vou deixar assim como você fez, era mais para aprender. Obrigada!