2012-10-04 17 views
17

Non riesco a trovare un modo per estrarre tutti i commenti come nell'esempio seguente.Corrispondenza regex tra due stringhe?

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

blocco con two -- -- non corrisponde molto probabilmente a causa del cattivo regex. Qualcuno può per favore indicarmi nella giusta direzione come estrarre le corrispondenze tra due stringhe.

Ciao Ho provato quello che avete suggerito nei commenti .... ecco una soluzione funzionante con un piccolo aggiornamento.

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

grazie!

+3

qualsiasi cosa tra [] è un singolo carattere, quindi (->) non cercherà che il raggruppamento faccia parte del problema ... –

+2

're.findall ('', stringa, re.DALEALL)' fare. Non hai bisogno di '^ \ (->)' qui, perché il punto interrogativo lo rende non-goloso. – BrtH

+0

Sembra che tu stia cercando solo le parole? Se è così, cosa c'è di sbagliato in 'm = re.findall ('[\ w] +', string, re.MULTILINE)'? Inoltre, string è davvero un brutto nome per una stringa, um. – Ben

risposta

32

questo dovrebbe fare il trucco

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

grazie per la risposta veloce e precisa. –

+1

Non è necessario il flag MULTILINE. –

+0

@AlanMoore, grazie hai ragione. Aggiornamento della risposta – iruvar

3

In generale, non è possibile fare corrispondenza arbitraria tra due delimitatori con un regular grammar.

specifcally, se si consente la nidificazione,

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

si incorrerà in alle questioni. Quindi, mentre potresti essere in grado di risolvere questo problema specifico con un'espressione regolare, qualsiasi espressione regolare che scrivi sarà in grado di essere interrotta da qualche altro nidificazione di commenti.

Per analizzare commenti arbitrari, è necessario passare a un metodo di analisi context free grammars. Un metodo semplice per farlo è quello di utilizzare un pushdown automaton.

+1

Non credo che i commenti annidati siano così comuni. Kinda sconfigge il punto di commento se qualcosa al suo interno viene elaborato? –

+1

E sembra che non siano possibili in HTML. http://stackoverflow.com/questions/442786/are-nested-html-comments-possible Ho intenzione di lasciarlo qui, perché penso che sia importante riconoscere, ma non mi aspetto alcun aumento. – Wilduck

+1

Le macchine a stati finiti non sono in grado di analizzare grammatiche libere da contesto: è possibile utilizzare gli automi Pushdown. –