2012-10-13 7 views
38

To musi być łatwiejsze niż to, na co się natknę. Mój problem polega na włączeniu ciąg znaków, który wygląda tak:Zapętlenie przez python regex pasuje

ABC12DEF3G56HIJ7 

do

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

I nie może dla życia mnie, zaprojektować poprawny zestaw pętli stosując dopasowanie REGEX. Sedno problemu polega na tym, że kod musi być całkowicie ogólny, ponieważ nie mogę założyć, jak długo będą fragmenty [A-Z], ani jak długo będą fragmenty [A-Z].

Dziękujemy za pomoc!

+2

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

Odpowiedz

72

Python za re.findall powinien działać dla Ciebie.

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. tak prosty. To działa pięknie. – da5id

21

Lepiej jest używać re.finditer jeśli zestaw danych jest duża:

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

tak, to jest lepszy sposób – kdubs

+0

Jeśli się nie mylę, ostatnia linia tego przykładu powinna brzmieć 'print m.group (2), '*', m.group (1)', aby dopasować pożądane wyjście OP . Uważam, że 'm.group (0)' jest "pełnym" dopasowaniem - tj. ABC12, DEF3, G56, HIJ7. – DaveL17

+0

@ DaveL17 Masz rację, dzięki. Nie zastanawiałem się zbyt długo, pisząc tę ​​odpowiedź, naprawioną teraz. – Mithril