2017-07-22 45 views
5

Daha uzun bir dizede bir desenle eşleşen alt dizelerle (yalnızca ikame olmaktan daha fazlası) bir şey yapmak istiyorum. Bir atama C ve diğer birçok programlama dillerinde olduğu gibi, bir değer döndüren bir ifade olsaydı, bu (Python semantik ile C sözdizimi kullanılarak) olacaktır: daha verboselyPython'da, düzenli ifadenin tüm eşleşmelerini bir dizede nasıl çözebilirim?

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

veya bir gibi bir atama kullanımından kaçınarak ifadesi: bu en programlama dillerinde mümkün değildir

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

en az bir: C, C++, Java, Perl, JavaScript, ... ama ikisi de Python mümkün görünmektedir. Pythonic bir eşdeğer var mı (kludgey karmaşasıyla bir mola veya devamsızlık ifadesi içermiyor)?

+2

cevap bağlıdır. Ne üzerinde dönüyorsun? Bire bir eşleme kesinlikle yoktur, fakat kesinlikle pythonic eşdeğerleri vardır. İstediğiniz şeyle biraz daha hassas olabilirseniz ... çünkü bu soru çok geniş olduğu için. –

cevap

4

Sen finditer arıyor olabilir:

Dönüş bir yineleyici veren maç dizesinde RE modeli için tüm örtüşmeyen eşleşmeleri üzerinde itiraz ediyor. Dize soldan sağa taranır ve eşleştirmeler bulunan sırayla döndürülür. Boş eşlemeler, başka bir eşleşmenin başlangıcına değmedikçe sonuca dahil edilir.

#!/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

Bu yalnızca dizgeyi bir kez tarar, böylece genel durumda çalışmayacaktır; Döngünün içindeki dizgede hemen hemen herhangi bir değişiklik, örneğin eşleştirilen deseni farklı uzunlukta olan bir şeyle değiştirerek kırılacaktır. – zizzler

+0

Belki de istediğiniz davranışı gösteren ve Python'da nasıl uygulanacağını soran bir örnek verebilirsiniz. "OP'nin ne istediğini tahmin et" oynamaya istekli değilim. –