2011-01-30 22 views
7

Tengo una cadena de entrada como esta: a1b2c30d40 y quiero tokenizar la cadena a: a, 1, b, 2, c, 30, d, 40.división de cadena de pitón

Sé que puedo leer cada carácter uno por uno y hacer un seguimiento del personaje anterior para determinar si debo tokenizarlo o no (2 dígitos seguidos significa no tokenizarlo) pero ¿hay alguna forma más pitonica? de hacer esto?

Respuesta

13
>>> re.split(r'(\d+)', 'a1b2c30d40') 
['a', '1', 'b', '2', 'c', '30', 'd', '40', ''] 

En el patrón: como el comentario dice, \d medios de "correspondencia de un dígito", + es un modificador que significa "coincide con uno o más", por lo que \d+ medios "emparejar tanto dígitos como sea posible". Esto se pone en un grupo (), por lo que todo el patrón en contexto de re.split significa "dividir esta cadena usando tantos dígitos como sea posible como separador, capturando además separadores coincidentes en el resultado". Si omitiera el grupo, obtendría ['a', 'b', 'c', 'd', ''].

+0

Umm No entiendo muy bien la expresión regular. ¿Te importa poner alguna explicación del patrón (\ d +)? – Hery

+1

Se divide en números/dígitos consecutivos ('\ d' es 0-9,' + 'es uno o más). – delnan

+1

http://docs.python.org/library/re.html – Samizdis