3
respostas

[Dúvida] conflito na formatação do numero

tô fazendo o curso "Python Brasil: validação de dados no padrão nacional" e estou na duvida de como resolver um problema, na mascara o formato deve valer para telefone fixo ( +55(99)9999-9999 ) quanto para telefone residencial ( +55(99)99999-9999 ) e tbm deve valer para internacionais q o formato e assim (+555(99)9999-9999 ) mas na hora da mascara acaba dando um conflito, por exemplo um numero que era para ficar assim (+55(99)27890-7845), acaba ficando assim (+559(92)7890-7845 ) o código que eu estou usando e esse:

import re


class TelefonesBr:
def __init__(self, telefone):
    if self.validacao_telefone(telefone):
        self.telefone = telefone
    else:
        raise ValueError('Telefone INVALIDO!!!')

def __str__(self):
    return self.telefone_formatado()

@staticmethod
def validacao_telefone(telefone):
    padrao = '([0-9]{2,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})'
    resp = re.findall(padrao, telefone)
    if resp:
        return True
    else:
        return False

def telefone_formatado(self):
    padrao = '([0-9]{2,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})'
    resp = re.search(padrao, self.telefone)
    return f"+{resp.group(1)}({resp.group(2)}){resp.group(3)}-{resp.group(4)}"
    

conhecem alguma outra maneira de formatação para que não aconteça o que eu citei?

3 respostas

Olá Victor, tudo bem?

Peço desculpa pela demora em respondê-lo.

O problema que você está enfrentando é que a máscara está formatando o número de uma maneira que não corresponde ao esperado.

O problema está na expressão regular que você está usando. A expressão '([0-9]{2,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})' está interpretando que o código do país pode ter de 2 a 3 dígitos, o que está causando o conflito no formato do número.

Uma alternativa para resolver isso é usar uma expressão regular que seja capaz de identificar corretamente o código do país e o número de telefone.

Você pode tentar usar a seguinte expressão regular: '(\+55)?(\([0-9]{2}\))([0-9]{4,5})\-([0-9]{4})'. Essa expressão define que o código do país (+55) é opcional, seguido do código de área entre parênteses, depois o número que pode ter de 4 a 5 dígitos e, por fim, o restante do número com 4 dígitos.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

até que resolve mas eu gostaria de uma solução onde mantivesse a opção de ter um código de pais com 3 dígitos, por exemplo a Albânia (+355)

Oi Victor, perdão pela demora em respondê-lo.

Nesse caso você pode alterar a sua expressão regular para a seguinte:

(\+[0-9]{2,3})?(\([0-9]{2}\))([0-9]{4,5})\-([0-9]{4})

A alteração que fiz foi somente dentro do primeiro parênteses, onde adicionei um contra barra para que o caractere "+" seja reconhecido como um caractere de fato e não uma operação da expressão regular. Já o restante da alteração, adicionei, parecido com os outros blocos, uma expressão que captura números de 0 a 9 e que sejam de 2 a 3 números.

Espero que assim resolva a sua situação.

Bons estudos!

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