No Python, como classificar naturalmente uma lista de sequências alfanuméricas de modo que os caracteres alfabéticos sejam classificados antes dos caracteres numéricos?

Este é um pequeno desafio que me confrontou recentemente. Vou fornecer minha resposta abaixo, mas estou curioso para ver se existem soluções mais elegantes ou eficientes.

Um delineamento dos requisitos conforme me foram apresentados:

As cadeias são alfanuméricas (consulte o conjunto de dados de teste abaixo)As cordas devem ser classificadas naturalmenteessa questão para explicação)Os caracteres alfabéticos devem ser classificados antes dos caracteres numéricos (por exemplo, 'abc' antes de '100')Instâncias maiúsculas de caracteres alfa devem ser classificadas antes de instâncias minúsculas (ou seja, 'ABc', 'Abc', 'abc')

Aqui está um conjunto de dados de teste:

test_cases = [
    # (unsorted list, sorted list)
    (list('bca'), ['a', 'b', 'c']),
    (list('CbA'), ['A', 'b', 'C']),
    (list('r0B9a'), ['a', 'B', 'r', '0', '9']),
    (['a2', '1a', '10a', 'a1', 'a100'], ['a1', 'a2', 'a100', '1a', '10a']),
    (['GAM', 'alp2', 'ALP11', '1', 'alp100', 'alp10', '100', 'alp1', '2'],
        ['alp1', 'alp2', 'alp10', 'ALP11', 'alp100', 'GAM', '1', '2', '100']),
    (list('ra0b9A'), ['A', 'a', 'b', 'r', '0', '9']),
    (['Abc', 'abc', 'ABc'], ['ABc', 'Abc', 'abc']),
]

Caso de teste de bónus

Isto é inspirado porComentário de Janne Karila abaixo que a resposta selecionada atualmente falha (mas não seria realmente uma preocupação prática no meu caso):

(['0A', '00a', 'a', 'A', 'A0', '00A', '0', 'a0', '00', '0a'],
        ['A', 'a', 'A0', 'a0', '0', '00', '0A', '00A', '0a', '00a'])

questionAnswers(3)

yourAnswerToTheQuestion