Exercício 12-06:

Crie uma função usando verifica_padrão que valide números de celulares. Um celular tem 9 dígitos depois do DDD. Por exemplo: (92)99812-1103.

Resposta:

##############################################################################
# Parte do livro Introdução à Programação com Python
# Autor: Nilo Ney Coutinho Menezes
# Editora Novatec (c) 2010-2024
# Quarta Edição - Março/2024 - ISBN 978-85-7522-886-9
#
# Site: https://python.nilo.pro.br/
#
# Arquivo: capitulo 12/exercicio-12-06.py
##############################################################################
# Funções número, sequência e verifica padrão da listagem 12.5
from functools import partial


def número(entrada, qmin, qmax):
    num = 0
    for caractere in entrada:
        if caractere.isnumeric():
            num += 1
        else:
            break
    if qmin <= num <= qmax:
        return num, 0, num - 1
    else:
        return -1, -1, -1


def sequência(entrada, padrão):
    posição, posição_max = 0, len(padrão)
    for caractere in entrada:
        if caractere == padrão[posição]:
            posição += 1  # Caracteres iguais, testa o próximo caractere
        else:
            break  # Saiu da sequência
        if posição == posição_max:  # Achou toda a sequência
            return 1, 0, posição - 1
    return -1, -1, -1


def verifica_padrão(entrada, padrões):
    posição = 0
    for padrão in padrões:
        achou, _, fim = padrão(entrada[posição:])
        if achou > 0:
            posição += fim + 1
        else:
            return -1, -1, -1
    return 1, 0, posição - 1


def numero_celular(entrada):
    padrão = [
        partial(sequência, padrão="("),
        partial(número, qmin=2, qmax=3),
        partial(sequência, padrão=")"),
        partial(número, qmin=5, qmax=5),
        partial(sequência, padrão="-"),
        partial(número, qmin=4, qmax=4),
    ]
    achou, _, _ = verifica_padrão(entrada, padrão)
    return achou > 0


entradas = [
    "(92)99999-9999",  # Sim
    "(11)99999-999",  # Não
    "(2)99999-9999",  # Não
    "(12)9999999999",  # Não
    "(312)9999999999",  # Não
    "(312)99999-9999",  # Sim
]

for entrada in entradas:
    print(f"{entrada}: é um celular? {'Sim' if numero_celular(entrada) else 'Não'}")
Clique aqui para baixar o arquivo