Re: [Python] regexp e gruppi

2013-09-11 Per discussione Marco De Paoli
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

2013-09-11 Per discussione Daniele Zambelli
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

2013-09-11 Per discussione Marco De Paoli
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

2013-09-11 Per discussione Daniele Zambelli
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

2013-09-10 Per discussione Daniele Zambelli
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-09-10 Per discussione Marco Beri
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

2013-09-10 Per discussione Marco De Paoli
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

2013-09-10 Per discussione Marco De Paoli
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

2013-09-10 Per discussione Daniele Zambelli
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