Utilizando a função verifica_padrão, escreva uma função que detecte um valor em reais no formato: R999,99ドル em que 9 representa qualquer dígito. O primeiro número pode ter um ou mais dígitos, mas a segunda parte (centavos) deve ter no máximo dois dígitos.
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-04.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 # Bônus, como reconhecer um padrão opcional. # Não faz parte do enunciado, mas é interessante. def opcional(entrada, padrões): achou, inicio, fim = verifica_padrão(entrada, padrões) if achou > 0: return achou, inicio, fim else: return 1, -1, -1 três_números = partial(número, qmin=1, qmax=3) centavos = partial(número, qmin=1, qmax=2) cifrão = partial(sequência, padrão="R$") vírgula = partial(sequência, padrão=",") # Apenas os valores citados no enunciado padrão = [cifrão, três_números, vírgula, centavos] # Usando a função opcional para aceitar valores sem centavos (bônus) # padrão = [cifrão, três_números, partial(opcional, padrões=[vírgula, centavos])] # Aqui uma pequena lista de entradas para facilitar a visualização entradas = [ "R123,45ドル", # Padrão encontrado "R123,450ドル", # Padrão não encontrado "123,45ドル", # Padrão não encontrado "R12,34ドル", # Padrão encontrado "R123,45ドル R12,34ドル R1,23ドル R1,0ドル", # Padrão encontrado quatro vezes "R123ドル R12ドル R1ドル R1,0ドル", # Padrão encontrado quatro vezes (se bônus - opcional ativado), uma vez caso contrário ] for entrada in entradas: print("Entrada:", entrada) achado = False posição = 0 while posição < len(entrada): achou, início, fim = verifica_padrão(entrada[posição:], padrão) if achou > 0: print(f"Reais nas posições: {posição+início} a {posição+fim} ", end="") print("Reais:", entrada[posição + início : posição + fim + 1]) achado = True posição += fim + 1 else: posição += 1 if not achado: print("Nenhum valor em reais encontrado na entrada") print()