1
resposta

Codigo Telefone

from TelefonesBr import TelefonesBr
import re

telefone = "esse é o meu telefone 5561984400000 da minha esposa é 25561984631000 e não tenho mais outros"

telefone_objeto = TelefonesBr(telefone)
telefone_objeto.numeros_encontrados()
telefone_objeto.format_numero()
print(telefone_objeto)

classe

import re


class TelefonesBr:
    def __init__(self, telefone):
        if self.valida_telefone(telefone):
            self.numero = telefone
        else:
            raise ValueError("Telefone não encontrado!")

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

    def numeros_encontrados(self):
        padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})"    # "?" indica que aquele grupo não é obrigatorio
        numeros_encontrados = re.findall(padrao, self.numero)
        print(numeros_encontrados)

    def valida_telefone(self, telefone):
        padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})"     # "?" indica que aquele grupo não é obrigatorio
        resposta = re.findall(padrao, telefone)
        if resposta:
            return True
        else:
            return False

    def format_numero(self):
        padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})"  # "?" indica que aquele grupo não é obrigatorio
        resposta = re.search(padrao, self.numero)
        numero_formatado = "+{}({}){}-{}".format(resposta.group(1), resposta.group(2), resposta.group(3), resposta.group(4))
        return numero_formatado

identifiquei dois bugs no código do professor se voce colocar dois telefones ele so vai pegar o primeiro apesar de eu tentar consegui apenas exibir a lista com dois telefones, outra coisa é que aqui no DF usamos 5 dígitos depois do código de área e nessa formatação o numero fica de fora se usarmos três números para o código do país

1 resposta

Olá Cosme.

Para imprimir os números, da sua função numeros_encontrados, de maneira formatada a lista de números, podemos fazer algumas modificações nela.

def numeros_encontrados(self):
        padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})"    # "?" indica que aquele grupo não é obrigatorio
        numeros_encontrados = re.findall(padrao, self.numero)
        print(numeros_encontrados)

Primeiro vamos aproveitar o fato do findall retornar um list e então podemos iterar sobre ele utilizando o for:

def numeros_encontrados(self):
        padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})"    # "?" indica que aquele grupo não é obrigatorio
        numeros_encontrados = re.findall(padrao, self.numero)
        #for numero in numeros_encontrados: #passando por cada numero que ele encontrar

        print(numeros_encontrados)

Agora podemos copiar a logica de formação que temos na função format_numero:

def format_numero(self):
        padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})"  # "?" indica que aquele grupo não é obrigatorio
        resposta = re.search(padrao, self.numero)
        numero_formatado = "+{}({}){}-{}".format(resposta.group(1), resposta.group(2), resposta.group(3), resposta.group(4))
        return numero_formatado

Vamos copiar a linha que formata o numero e atribui para a variável numero_formatado e colocar ela dentro do for que criamos na nossa função numeros_encontrados:

    def numeros_encontrados(self):
        padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})"    # "?" indica que aquele grupo não é obrigatorio
        numeros_encontrados = re.findall(padrao, self.numero)

        #for numero in numeros_encontrados: #passando por cada numero que ele encontrar
            #numero_formatado = "+{}({}){}-{}".format(resposta.group(1), resposta.group(2), resposta.group(3), resposta.group(4))

        print(numeros_encontrados)

Porem devemos adapta-la para as nossas variáveis e nosso proposito, primeiro vamos substituir os resposta.group(x) por numero[x-1], isso porque o nosso numero é uma lista que contem cada grupo do nosso telefone e devemos começar de 0 e não de 1.

def numeros_encontrados(self):
        padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})"    # "?" indica que aquele grupo não é obrigatorio
        numeros_encontrados = re.findall(padrao, self.numero)

        #for numero in numeros_encontrados: #passando por cada numero que ele encontrar
            #numero_formatado = "+{}({}){}-{}".format(numero[0], numero[1], numero[2], numero[3])

        print(numeros_encontrados)

agora vamos colocar nosso print(numeros_encontrados) dentro do for e invés de imprimir a variável, vamos imprimir direto a string formatada:

    def numeros_encontrados(self):
            padrao = "([0-9]{2,3})?([0-9]{2})([0-9]{5})([0-9]{4})"    # "?" indica que aquele grupo não é obrigatorio
            numeros_encontrados = re.findall(padrao, self.numero)
            for numero in numeros_encontrados: #passando por cada numero que ele encontrar
                print("+{}({}){}-{}".format(numero[0], numero[1], numero[2], numero[3]))

Agora a função numeros_encontrados é capaz de imprimir todos os números encontrados e também formata-los.

Recomendo tentar adaptar esse novo código para ser usado pela função str, algo como:

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

E dessa maneira sua classe será capaz de imprimir todos os números sozinha e formatados.

Espero ter te ajudado, mas qualquer duvida não hesite em perguntar.

Bons Estudos.