Regex para separar numérico de alfa

Tengo un montón de cuerdas:

"10people" "5cars" .. 

¿Cómo podría dividir esto a?

 ['10','people'] ['5','cars'] 

Puede ser cualquier cantidad de números y texto.

Estoy pensando en escribir algún tipo de expresión regular, pero estoy seguro de que hay una forma fácil de hacerlo en Python.

 >>> re.findall('(\d+|[a-zA-Z]+)', '12fgsdfg234jhfq35rjg') ['12', 'fgsdfg', '234', 'jhfq', '35', 'rjg'] 

Utilice la expresión regular (\d+)([a-zA-Z]+) .

 import re a = ["10people", "5cars"] [re.match('^(\\d+)([a-zA-Z]+)$', x).groups() for x in a] 

Resultado:

 [('10', 'people'), ('5', 'cars')] 
 >>> re.findall("\d+|[a-zA-Z]+","10people") ['10', 'people'] >>> re.findall("\d+|[a-zA-Z]+","10people5cars") ['10', 'people', '5', 'cars'] 

En general, una división en /(?<=[0-9])(?=[az])|(?<=[az])(?=[0-9])/i separa una cadena de esa manera.

 >>> import re >>> s = '10cars' >>> m = re.match(r'(\d+)([az]+)', s) >>> print m.group(1) 10 >>> print m.group(2) cars 

Si usted es como yo y da vueltas para evitar los regexpes solo porque son feos, aquí hay un enfoque no regex:

 data = "5people10cars" numbers = "".join(ch if ch.isdigit() else "\n" for ch in data).split() names = "".join(ch if not ch.isdigit() else "\n" for ch in data).split() final = zip (numbers, names) 

Aprovechando la idea de jsbueno, utilizando str.translate, seguido de split:

 import string allchars = ''.join(chr(i) for i in range(32,256)) digExtractTrans = string.maketrans(allchars, ''.join(ch if ch.isdigit() else ' ' for ch in allchars)) alpExtractTrans = string.maketrans(allchars, ''.join(ch if ch.isalpha() else ' ' for ch in allchars)) data = "5people10cars" numbers = data.translate(digExtractTrans).split() names = data.translate(alpExtractTrans).split() 

Solo necesita crear las tablas de traducción una vez, luego llamar a traducir y dividir con la frecuencia que desee.