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.