2017-07-22 37 views
5

Chcę coś zrobić (więcej niż tylko substytucję) z podciągami pasującymi do wzorca w dłuższym ciągu. Jeśli przydział było wyrażenie zwracania wartości, jak w C i większości innych językach programowania, będzie to (za pomocą składni C z semantyki Pythona)W Pythonie, w jaki sposób mogę zapętlić wszystkie dopasowania wyrażenia regularnego na ciągu znaków?

while (match = re.search(pat, str)) { 
     /* do something to the string, using the match object, 
      in addition to removing or replacing the substring 
     */ 
    } 

lub więcej --long, unika się stosowania przypisania w postaci wyrażenie:

for (match = re.search(pat, str); 
     match; 
     match = re.search(pat, str)) { 
    /* do something to the string, using the match object */ 
} 

przynajmniej jeden z nich jest możliwe w większości języków programowania: C, C++, Java, Perl, javaScript ... ale żaden z nich nie wydaje się być możliwe w Pythonie. Czy istnieje odpowiednik python (nie zawierający kludgey mess z instrukcją break lub continue)?

+2

Odpowiedź zależy. O co ci chodzi? Na pewno nie ma mapowania jeden do jednego, ale na pewno są to odpowiedniki python. Jeśli możesz być nieco bardziej precyzyjny z tym, czego chcesz ... ponieważ w tej kwestii to pytanie jest zbyt szerokie. –

Odpowiedz

4

Możesz być szuka finditer: obiekty

zwraca iterator uzyskując mecz na wszystkie nie pokrywających meczach za wzór RE w ciąg. Ciąg jest skanowany od lewej do prawej, a dopasowania są zwracane w znalezionej kolejności. Puste mecze są uwzględniane w wyniku, chyba że dotkną początku innego meczu.

#!/usr/bin/env python3 

import re 

s = "abcabcabc"; 
it = re.finditer("(\w)", s) 
for m in it: 
    print(m.groups()) 
$ ./t.py 
('a',) 
('b',) 
('c',) 
('a',) 
('b',) 
('c',) 
('a',) 
('b',) 
('c',) 
+0

To skanuje tylko ciąg jeden raz, więc nie będzie działać w ogólnym przypadku; prawie każda zmiana ciągu wewnątrz pętli spowoduje jego przerwanie, na przykład zastąpienie dopasowanego wzoru czymś, co ma inną długość. – zizzler

+0

Być może możesz podać przykład, który ilustruje zachowanie, które chcesz i zapytać, jak go wdrożyć w Pythonie. Nie chcę grać "zgadnij, co chce OP". –