1
resposta

[Dúvida] A faixa "à-ÿ" não está abrangendo todos os caracteres acentuados

book_title = input('Digite o título do livro: ')
to_search = input('Digitar as iniciais para pesquisa: ')

# A faixa "à-ÿ" não está abrangendo todos os caracteres acentuados!
# result = re.findall(rf'\b{to_search}[a-zà-ÿ]*', book_title, re.IGNORECASE)

# Adicionando explicitamente os caracteres acentuados maiúsculos e minúsculos.
# Na ideia de ampliar o intervalo de busca para incluir caracteres que podem não estar sendo reconhecidos. Porém, não funcionou com acentuação Unicode.
# result = re.findall(rf'\b{to_search}[a-zA-ZáÁà ÀéÉíÍóÓúÚãÃõÕçÇ]*', book_title, re.IGNORECASE)

# Solução (Funcionou):
# Utilizar a lib "unicodedata"
import unicodedata

'''Função para normalizar o texto e/ou o ítem de busca, removendo acentos'''
def remove_accentuation(txt):
  return ''.join(
    c for c in unicodedata.normalize('NFD', txt)
    if unicodedata.category(c) != 'Mn'
  )

normalized_title = remove_accentuation(book_title)  
normalized_to_search = remove_accentuation(to_search)

result = re.findall(rf'\b{normalized_to_search}[a-z]*', normalized_title, re.IGNORECASE)
print(result)
1 resposta

Olá Eduardo! Tudo bem?

Isso acontece porque essa faixa não cobre todos os caracteres acentuados possíveis, especialmente quando lidamos com diferentes casos de acentuação e letras maiúsculas.

A solução que você encontrou utilizando a biblioteca unicodedata para normalizar o texto e remover acentos é uma abordagem muito eficaz. Ao normalizar o texto, você transforma caracteres acentuados em suas formas básicas, permitindo que a busca seja feita de forma mais abrangente e sem se preocupar com acentos.

Aqui está um exemplo prático de como seu código está funcionando:

  1. Entrada do Usuário:

    • Título do livro: "Aventuras na Amazônia"
    • Iniciais para pesquisa: "A"
  2. Processo de Normalização:

    • O título "Aventuras na Amazônia" é normalizado para "Aventuras na Amazonia".
    • A inicial "A" permanece a mesma, pois não possui acento.
  3. Busca:

    • A regex rf'\b{normalized_to_search}[a-z]*' procura por palavras que começam com "A" no título normalizado.
  4. Saída:

    • O resultado será ["Aventuras", "Amazonia"], que são as palavras que começam com "A" no título.

Essa abordagem é muito útil para garantir que você capture todas as palavras corretamente, independentemente dos acentos.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.