2012-10-13 311 views
38

Esto tiene que ser más fácil de lo que me estoy encontrando. Mi problema está convirtiendo una cadena que tiene este aspecto:Looping a través de Python Regex coincide con

ABC12DEF3G56HIJ7 

en

12 * ABC 
3 * DEF 
56 * G 
7 * HIJ 

Y no puedo, por la vida de mí, diseñar un conjunto correcto de bucles utilizando coincidencia de REGEX. El quid de la cuestión es que el código tiene que ser completamente general porque no puedo suponer cuánto tiempo durarán los fragmentos [A-Z], ni cuánto tiempo durarán los fragmentos [0-9].

¡Gracias por cualquier ayuda!

+2

' '' .join ("% s *% s \ n" % (n, w) para w, n en re.findall (r '(? i) ([az] +) (\ d +)', input_string)) ' – jfs

Respuesta

72

Python's re.findall debería funcionar para usted.

Live demo

import re 

s = "ABC12DEF3G56HIJ7" 
pattern = re.compile(r'([A-Z]+)([0-9]+)') 

for (letters, numbers) in re.findall(pattern, s): 
    print(numbers, '*', letters) 
+2

Wow. tan sencillo. Esto funciona maravillosamente. – da5id

21

Es mejor utilizar re.finditer si conjunto de datos es grande:

import re 

s = "ABC12DEF3G56HIJ7" 
pattern = re.compile(r'([A-Z]+)([0-9]+)') 

for m in re.finditer(pattern, s): 
    print m.group(2), '*', m.group(1) 
+0

sí, esta es la mejor manera – kdubs

+0

Si no me equivoco, la última línea de este ejemplo debe ser 'print m.group (2), '*', m.group (1)' para ajustarse a la salida deseada del OP . Creo que 'm.group (0)' es la coincidencia 'completa', es decir, ABC12, DEF3, G56, HIJ7. – DaveL17

+0

@ DaveL17 Tienes razón, gracias. No pensé mucho mientras escribía esta respuesta, arreglada ahora. – Mithril

Cuestiones relacionadas