2012-10-04 13 views
17

Aşağıdaki örnekte olduğu gibi tüm yorumları ayıklamanın bir yolunu bulamıyorum. two -- -- ileİki dizge arasında eşitleme eşleşmesi?

>>> import re 
>>> string = ''' 
... <!-- one 
... --> 
... <!-- two -- -- --> 
... <!-- three --> 
... ''' 
>>> m = re.findall ('<!--([^\(-->)]+)-->', string, re.MULTILINE) 
>>> m 
[' one \n', ' three '] 

blok nedeniyle kötü regex en olası eşleşmeyen. Birisi iki dize arasındaki eşleşmeleri nasıl doğrulamak için bana doğru yönde işaret edebilir.


Merhaba, yorumlarda önerdiğin şeyleri test ettim ... işte burada küçük bir yükseltme ile çalışıyoruz.

>>> m = re.findall ('<!--(.*?)-->', string, re.MULTILINE) 
>>> m 
[' two -- -- ', ' three '] 
>>> m = re.findall ('<!--(.*\n?)-->', string, re.MULTILINE) 
>>> m 
[' one \n', ' two -- -- ', ' three '] 

Teşekkürler!

+3

[] arasındaki tek bir karakter tek bir karakterdir, yani (>>) bu gruplama soruna bir bakmaz ... –

+2

're.findall ('', string, re.DOTALL)' gerekir yap. Buraya '^ \ (->)' gerek yok, çünkü soru işareti açgözlü değil. – BrtH

+0

Sadece kelimeleri mi arıyorsun? Eğer öyleyse, m = re.findall ('[\ w] +', string, re.MULTILINE) 'ile ilgili sorun nedir? Ayrıca, dize, dize için gerçekten kötü bir isim. – Ben

cevap

32

Bu kandırmasına Genelde

m = re.findall ('<!--(.*?)-->', string, re.DOTALL) 
+0

Hızlı ve kesin yanıt için teşekkür ederiz. –

+1

MULTILINE bayrağına ihtiyacınız yok. –

+0

@AlanMoore, sağ olduğunuz için teşekkürler. Yanıt – iruvar

3

yapmalıdır, bir regular grammar iki ayraçları arasındaki keyfi eşleştirme yapmak mümkün değildir. Specifcally

, sen iç içe izin eğer,

<!-- how do you deal <!-- with nested --> comments? --> 

Eğer konulara çalıştırmak gerekir. Yani, bu özel problemi normal bir anlatımla çözebiliyor olsanız da, yazdığınız normal ifadeler yorumların diğer garip şekilde yerleştirilmesiyle kırılabilecektir.

Rasgele yorum ayrıştırmak için, context free grammars ayrıştırma yöntemine geçmeniz gerekir. Bunu yapmak için basit bir yöntem, pushdown automaton kullanmaktır.

+1

İç içe geçmiş yorumların hepsinin ortak olduğunu sanmıyorum. Kinda içinde herhangi bir şey işlenirse yorumlama noktasını yener? –

+1

Ve HTML'de mümkün değil gibi görünüyor. http://stackoverflow.com/questions/442786/are-nested-html-comments-possible Bunu burada bırakacağım, çünkü bence önemli olduğunu düşünüyorum, ancak herhangi bir gelişme beklemiyorum. – Wilduck

+1

Sonlu durum makineleri, bağlamdan bağımsız dilbilgileri ayrıştıramaz - Aşağı açılan otomatikmanları kullanabilirsiniz. –