1
resposta

Problema com a lógica do pattern do telefone

Existe um pequeno problema na lógica da validação pelo pattern: '([0-9]{2,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})'

Pois caso seja passado o código do pais ele pode entender que seja 3 dígitos quando passamos apenas 2, e no primeiro trecho do numero de telefone entender que são 4 números quando passamos 5 criando um código de pais invalido, fora isso o código de pais pode ter até 4 dígitos de acordo com a fonte: https://countrycode.org/

segue meu código para mostrar o problema:

import re


class Telefone:
    def __init__(self, telefone):

        self.pattern = '([0-9]{2,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})'

        if self.validate_tel(self.pattern, telefone):
            self.telefone = telefone

    @property
    def telefone(self):
        return self._telefone

    @telefone.setter
    def telefone(self, telefone):
        self._telefone = telefone

    @property
    def pattern(self):
        return self._pattern

    @pattern.setter
    def pattern(self, pattern):
        self._pattern = pattern

    @staticmethod
    def validate_tel(pattern, string):
        if re.findall(pattern, string):
            return True
        else:
            return False

    def format_tel(self):
        tel = re.search(self.pattern, self.telefone)
        return '+55({}){}-{}'.format(
            tel.group(2),
            tel.group(3),
            tel.group(4)
        ) if (tel.group(1) is None) else '+{}({}){}-{}'.format(
            tel.group(1),
            tel.group(2),
            tel.group(3),
            tel.group(4)
        )

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

Executando a Main:

from Telefone import Telefone


tel = Telefone('5511912341234')
print(tel)

O resultado no display é: +551(19)1234-1234

Ainda estou pensando em uma lógica com o regex para tornar o código correto, caso tenham ja alguma solução por favor compartilhem aqui nesse post.

1 resposta

Oii Kevin, como você está? Espero que esteja bem ^-^

Respondi um tópico a respeito disso neste link, veja se faz sentido para você.

Qualquer dúvida vamos conversando por aqui.

Abraços!