Bem, simplesmente, [0-9]* corresponde cadeias que consistem inteiramente de zero ou mais dígitos, incluindo strings vazias. Qualquer coisa que corresponda a uma string vazia, coincide com quaisquer dois caracteres, de modo que a substituição @ seja adicionada entre todas as letras na entrada. Strings de vários dígitos são substituídas por um @ , pois a expressão corresponde a todos os dígitos consecutivos de uma vez.
Portanto, na string de entrada ab43 , as correspondências para [0-9]+ são (com alguns espaços em branco adicionados para maior clareza):
a b 434
^ ^ ^^^- here, a string of some digits
^ ^- here, a zero-length string
^- here, a zero-length string
Use [0-9] para corresponder exatamente a um dígito ou [0-9][0-9]* para corresponder a um ou mais (ou [0-9]+ em expressões regulares estendidas).