Re: [Python] regexp e gruppi
Il 10 settembre 2013 22:12, Daniele Zambelli daniele.zambe...@gmail.com ha scritto: Quasi, ho aggiunto un ? per rendere pigro il quantificatore *: giusto! P.S. Se può servire... hai dato un contributo al Libro libero di matematica: Matematica C3 (www.matematicamente.it), grazie. lavoro meritevole, grazie a te! Marco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] regexp e gruppi
Il giorno 10 settembre 2013 22:12, Daniele Zambelli daniele.zambe...@gmail.com ha scritto: ho aggiunto un ? per rendere pigro il quantificatore *: Il dubbio che ho è che la faccenda non sia molto efficiente dato che ci possono essere molte definizioni. E, se non sbaglio, si avvia un meccanismo di backtracking. Per questo motivo avevo cercato di cambiare il gruppo come nello spezzone seguente: re1 = re.compile(r'''^\\begin\{description\}\n \\item\[\{([^\}]+)\}\]\s\\leavevmode\n (.*^(\n\\end\{description\}))\n\\end\{description\}$''', re.M | re.S | re.X) Ma così non funziona. C'è un modo per evitare il backtracking? Ciao -- Daniele www.fugamatematica.blogspot.com giusto! nel verso forse è perché non guardiamo le cose Quando non ci capiamo, ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] regexp e gruppi
Il giorno 11 settembre 2013 15:28, Daniele Zambelli daniele.zambe...@gmail.com ha scritto: Il dubbio che ho è che la faccenda non sia molto efficiente dato che ci possono essere molte definizioni. E, se non sbaglio, si avvia un meccanismo di backtracking. Per questo motivo avevo cercato di cambiare il gruppo come nello spezzone seguente: re1 = re.compile(r'''^\\begin\{description\}\n \\item\[\{([^\}]+)\}\]\s\\leavevmode\n (.*^(\n\\end\{description\}))\n\\end\{description\}$''', re.M | re.S | re.X) Ma così non funziona. C'è un modo per evitare il backtracking? non credo che ci sia modo di evitare una intera stringa, che è quello che cercavi di fare tu, bensì al più un solo carattere Dalla documentazione: Characters that are not within a range can be matched by *complementing*the set. If the first character of the set is '^', all the characters that are *not* in the set will be matched. For example, [^5] will match any character except '5', and [^^] will match any character except '^'. ^ has no special meaning if it’s not the first character in the set. ... non si parla di sequenze ma solo di singoli caratteri direi che non c'è scampo all'andare di non-greedy come effettivamente hai fatto Se non ricordo male questa limitazione è intrinseca e ha a che fare con il vincolo delle espressioni regolari di poter essere implementate con automi a stati finiti gradite altre opinioni, Marco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] regexp e gruppi
Il giorno 11 settembre 2013 15:46, Marco De Paoli depao...@gmail.com ha scritto: [...] Se non ricordo male questa limitazione è intrinseca e ha a che fare con il vincolo delle espressioni regolari di poter essere implementate con automi a stati finiti Grazie -- Daniele www.fugamatematica.blogspot.com giusto! nel verso forse è perché non guardiamo le cose Quando non ci capiamo, ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] regexp e gruppi
Salve a tutti. Ho un problema che forse si può risolvere con una espressione regolare adatta. Un testo LaTeX contiene delle definizioni e delle descrizioni come nel seguente esempio: Prima delle modifiche: \begin{description} \item[{Semiretta}] \leavevmode Si dice semiretta ciascuna delle due parti in cui una retta è divisa da un suo punto. Quel punto si chiama \textbf{origine} della semiretta. L'origine appartiene alla semiretta. \end{description} Esempi \begin{itemize} \item {} \begin{description} \item[{$4 x ^{2 } - 9 = 0$}] \leavevmode risoluzione \end{description} La prima description è una definizione, la seconda no. Io vorrei trasformarlo nel seguente modo: Dopo le modifiche: \begin{definizione} \textbf{Semiretta} Si dice semiretta ciascuna delle due parti in cui una retta è divisa da un suo punto. Quel punto si chiama \textbf{origine} della semiretta. L'origine appartiene alla semiretta. \end{definizione} Esempi \begin{itemize} \item {} \begin{description} \item[{$4 x ^{2 } - 9 = 0$}] \leavevmode risoluzione \end{description} Io avevo pensato alla seguente espressione: re1 = re.compile(r'\\begin{description}\n\\item\[\{([^\}]+)\}] \\leavevmode([^(\\end{description})])\\end{description}', re.M) seguita dalla sostituzione: re1.sub(r'\\begin{definizione}\n\\textbf{\1}\2\\end{definizione}' Ho provato anche a sostituire '\n' con '\xe2\x80\xa9': re1 = re.compile(r'\\begin{description}\xe2\x80\xa9\\item\[\{([^\}]+)\}] \\leavevmode([^(\\end{description})])\\end{description}', re.M) seguita dalla sostituzione: re1.sub(r'\\begin{definizione}\xe2\x80\xa9\\textbf{\1}\2\\end{definizione}' ma la situazione non è migliorata. Ho fatto altre millemila prove che non sto a riportare, ma evidentemente mi sfugge qualcosa. Mi rivolgo ai pazienti maghi delle regexp chiedendo qualche aiuto. Grazie. -- Daniele www.fugamatematica.blogspot.com giusto! nel verso forse è perché non guardiamo le cose Quando non ci capiamo, ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] regexp e gruppi
2013/9/10 Daniele Zambelli daniele.zambe...@gmail.com re1 = re.compile(r'\\begin{description}\n\\item\[\{([^\}]+)\}] \\leavevmode([^(\\end{description})])\\end{description}', re.M) Sono molto infognato e in questo momento non riesco a darti una mano, ma qui stai facendo un errore. Non usare le raw string se usi il doppio backslash. print r\\b\n \\b\n print \\b\n \b Ciao. Marco. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] regexp e gruppi
così farebbe più o meno quello che ti serve? re1 = re.compile(r'^\\begin\{description\}\n\\item\[\{([^\}]+)\}\] \\leavevmode\n(.*)\\end\{description\}$', re.M | re.S) re1.sub(r'\\begin{definizione}\n\\textbf{\1}\n\2\\end{definizione}', Il 10 settembre 2013 13:31, Marco Beri marcob...@gmail.com ha scritto: 2013/9/10 Daniele Zambelli daniele.zambe...@gmail.com re1 = re.compile(r'\\begin{description}\n\\item\[\{([^\}]+)\}] \\leavevmode([^(\\end{description})])\\end{description}', re.M) Sono molto infognato e in questo momento non riesco a darti una mano, ma qui stai facendo un errore. Non usare le raw string se usi il doppio backslash. print r\\b\n \\b\n print \\b\n \b Ciao. Marco. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] regexp e gruppi
Il 10 settembre 2013 15:02, Marco De Paoli depao...@gmail.com ha scritto: così farebbe più o meno quello che ti serve? ops, sorry per il top posting Marco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] regexp e gruppi
Il giorno 10 settembre 2013 15:02, Marco De Paoli depao...@gmail.com ha scritto: così farebbe più o meno quello che ti serve? Quasi, ho aggiunto un ? per rendere pigro il quantificatore *: Il programmino di prova: from __future__ import print_function import re a = open('../test/def.tex').read() print('prima:\n{}\n'.format(a)) re1 = re.compile(r'''^\\begin\{description\}\n \\item\[\{([^\}]+)\}\]\s\\leavevmode\n (.*?)\n\\end\{description\}$''', re.M | re.S | re.X) b = re1.sub(r'\\begin{definizione}\n\\textbf{\1}\n\2\\end{definizione}', a) print('dopo:\n{}\n'.format(b)) open('../test/defpost.tex', 'w').write(b) Siete forti!!! Grazie. P.S. Se può servire... hai dato un contributo al Libro libero di matematica: Matematica C3 (www.matematicamente.it), grazie. -- Daniele www.fugamatematica.blogspot.com giusto! nel verso forse è perché non guardiamo le cose Quando non ci capiamo, ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python