Dividir letras de números dentro de una cadena

Estoy procesando cadenas como esta: "125A12C15" Necesito dividirlas en los límites entre letras y números, por ejemplo, esta debería convertirse en ["125","A","12","C","15"] .

¿Hay una forma más elegante de hacer esto en Python que ir a través de su posición por posición y verificar si es una letra o un número, y luego concatenar en consecuencia? Por ejemplo, ¿una función o módulo incorporado para este tipo de cosas?

Gracias por los punteros!

Use itertools.groupby junto con el método str.isalpha :

Docstring:

groupby (iterable [, keyfunc]) -> crea un iterador que devuelve (key, sub-iterator) agrupados por cada valor de key (value).


Docstring:

S.isalpha () -> bool

Devuelva True si todos los caracteres en S son alfabéticos y hay al menos un carácter en S, False de lo contrario.


 In [1]: from itertools import groupby In [2]: s = "125A12C15" In [3]: [''.join(g) for _, g in groupby(s, str.isalpha)] Out[3]: ['125', 'A', '12', 'C', '15'] 

O posiblemente re.findall o re.split del módulo de expresiones regulares :

 In [4]: import re In [5]: re.findall('\d+|\D+', s) Out[5]: ['125', 'A', '12', 'C', '15'] In [6]: re.split('(\d+)', s) # note that you may have to filter out the empty # strings at the start/end if using re.split Out[6]: ['', '125', 'A', '12', 'C', '15', ''] In [7]: re.split('(\D+)', s) Out[7]: ['125', 'A', '12', 'C', '15'] 

En cuanto al rendimiento, parece que usar una expresión regular es probablemente más rápido:

 In [8]: %timeit re.findall('\d+|\D+', s*1000) 100 loops, best of 3: 2.15 ms per loop In [9]: %timeit [''.join(g) for _, g in groupby(s*1000, str.isalpha)] 100 loops, best of 3: 8.5 ms per loop In [10]: %timeit re.split('(\d+)', s*1000) 1000 loops, best of 3: 1.43 ms per loop