Base alla corrispondenza tra le due stringhe?

Non riesco a trovare un modo per estrarre tutti i commenti, come nel seguente esempio.

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

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


Ciao ho provato quello che voi ragazzi suggerito nei commenti…. qui è soluzione di lavoro con un po ‘ di aggiornamento.

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

grazie!

  • nulla tra [] e [] è un singolo carattere (–>) vi aspetto per che il gruppo è parte del problema…
  • re.findall('<!--(.*?)-->', string, re.DOTALL) dovrebbe fare. Non hai bisogno di ^\(-->) qui, perché il punto di domanda lo rende non-greedy.
  • Sembra che tu stai cercando solo le parole? Se è così, cosa c’è di sbagliato con m = re.findall('[\w]+', string, re.MULTILINE)? Inoltre, la corda è un brutto nome per una, ehm, stringa.

 

2 Replies
  1. 37

    questo dovrebbe fare il trucco

     m = re.findall ( '<!--(.*?)-->', string, re.DOTALL)
    • grazie per la veloce e precisa risposta.
    • Non hai bisogno di MULTILINE bandiera.
    • grazie hai ragione. Aggiornata la risposta
    • Nel caso qualcuno si chiede, il “re.DOTALL” bandiera fa il punto (.) per adattarsi a qualsiasi tipo, compresi i newline. Il (.*?) acquisisce il testo all’interno della parentesi, e .*? significa che il “non-greedy” versione .* (cioè di catturare il più possibile le partite).
    • Se <!-- e --> dovrebbero essere parte di una lista di elementi, la cattura parentesi devono essere rimossi – re.findall ( '<!--.*?-->', string, re.DOTALL)
  2. 3

    In generale, è impossibile fare arbitrario di corrispondenza tra i due delimitatori con un grammatica regolare.

    Specifcally, se si consente la nidificazione,

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

    si esegue in problemi. Così, mentre si può essere in grado di risolvere questo problema specifico con un’espressione regolare, qualsiasi espressione regolare che scrivi sarà in grado di essere rotto da qualche altra strana la nidificazione dei commenti.

    Per analizzare arbitrario commenti, devi passare ad un metodo per l’analisi di context free grammars. Un metodo semplice per farlo è quello di utilizzare un pushdown automa.

    • Non credo che i commenti nidificati sono tutti comuni. Un pò sconfigge il punto di commentare se qualcosa dentro si è trasformato?
    • E sembra che non sono possibili in HTML. stackoverflow.com/questions/442786/… ho intenzione di lasciare questo qui, perché penso che sia importante riconoscere, ma non mi aspetto alcun upvotes.
    • Macchine a stati finiti non può analizzare context free grammars) – si può usare Pushdown automi.
    • Ahhhhh, naturalmente. Ho modificato la risposta a riflettere questo

Lascia un commento