Re: [Python] Ricerca e sostituzione con regex
On Sun, 16 Jun 2019, 19:32 Daniele Zambelli, wrote: > Becca il primo e l'ultimo dollaro ma salta quelli intermedi. So che > Marco lo aveva spiegato benissimo, ma non ho sotto mano il suo libro e > non mi ricordo come si risolve... > Alla peggio puoi iterare fino a che non sostituisci nulla. Vai sul sicuro così 😉 Ciao. Marco. ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Ricerca e sostituzione con regex
Devi vedere come fare le regex no gready... Di default cercano la stringa massima che corrisponde alla definizione. (Scusate il quoting, ma non ho voglia di cancellare tutto lo stack dal cell...) Il dom 16 giu 2019, 19:54 Daniele Zambelli ha scritto: > Il giorno dom 16 giu 2019 alle ore 19:32 Daniele Zambelli > ha scritto: > > [...] > > L'avrei risolta così: > > result = re.sub(r'\$\$(.[^\$\$]*)\$\$', > r'\[\1\]', > string.rstrip(), flags=re.S) > result = re.sub(r'\$(.[^\$]*)\$', > r'\(\1\)', > result, flags=re.S) > > Non so se la soluzione è sensata, cosa dite? > > -- > > 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 > https://lists.python.it/mailman/listinfo/python > ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Ricerca e sostituzione con regex
Il giorno dom 16 giu 2019 alle ore 19:32 Daniele Zambelli ha scritto: > [...] L'avrei risolta così: result = re.sub(r'\$\$(.[^\$\$]*)\$\$', r'\[\1\]', string.rstrip(), flags=re.S) result = re.sub(r'\$(.[^\$]*)\$', r'\(\1\)', result, flags=re.S) Non so se la soluzione è sensata, cosa dite? -- 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 https://lists.python.it/mailman/listinfo/python
Re: [Python] Ricerca e sostituzione con regex
Il giorno dom 16 giu 2019 alle ore 18:31 Lorenzo Buonanno ha scritto: > > Prova una cosa come > > import re > first_substitution = re.sub(r"\$\$(.*?)\$\$", r"\[\1\]", input_text, > flags=re.S) > final_text = re.sub(r"\$(.*?)\$", r"\(\1\)", first_substitution, flags=re.S) Intanto grazie per le vostre indicazioni. La funzione che ho realizzato è: def translate(string): """translate: "" > "\[\]" "$$" > "\(\)" >>> print(translate(r'')) \[\] >>> print(translate(r'$$')) \(\) >>> print(translate(r'$$a^2=b^2+c^2$$')) \[a^2=b^2+c^2\] >>> print(translate(r'$\frac{3+x}{x}$')) \(\frac{3+x}{x}\) >>> print(translate(r'''$$ ... a^2=b^2+c^2 ... $$''')) \[ a^2=b^2+c^2 \] >>> print(translate(r'primo:~$2$; secondo: $5$; terzo:~$7$')) primo:~\(2\); secondo:\(5\); terzo:~\(7\) """ result = re.sub(r'\$\$(.*)\$\$', r'\[\1\]', string.rstrip(), flags=re.S) result = re.sub(r'\$(.*)\$', r'\(\1\)', result, flags=re.S) return result In un primo tempo non c'era il flag S e gli ultimi due test fallivano. Aggiunto il flag l'ultimo test continua a fallire: Failed example: print(translate(r'primo:~$2$; secondo: $5$; terzo:~$7$')) Expected: primo:~\(2\); secondo:\(5\); terzo:~\(7\) Got: primo:~\(2$; secondo: $5$; terzo:~$7\) Becca il primo e l'ultimo dollaro ma salta quelli intermedi. So che Marco lo aveva spiegato benissimo, ma non ho sotto mano il suo libro e non mi ricordo come si risolve... -- 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 https://lists.python.it/mailman/listinfo/python
Re: [Python] Ricerca e sostituzione con regex
> > > Aperta, aperta, chiusa, chiusa. Beh si hai ragione 😅 ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Ricerca e sostituzione con regex
On Sun, 16 Jun 2019, 18:26 Leo Lo Tito, wrote: > Ciao, si potresti usare le espressioni regolari, ma sarà il caldo a farmi > ragionare così... utilizzerei due "funzioncine" con lo split e un ciclo > pari/dispari dove pari, inserisci l'apertura e dispari la chiusura degli > elementi. > Aperta, aperta, chiusa, chiusa. In questo caso il pari/dispari non funzionerebbe. Ciao. Marco. ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Ricerca e sostituzione con regex
Prova una cosa come import re first_substitution = re.sub(r"\$\$(.*?)\$\$", r"\[\1\]", input_text, flags=re.S) final_text = re.sub(r"\$(.*?)\$", r"\(\1\)", first_substitution, flags=re.S) On Sun, Jun 16, 2019 at 3:50 PM Daniele Zambelli wrote: > Il giorno dom 16 giu 2019 alle ore 14:06 Giovanni Vittorio Spina > ha scritto: > > > > Ponendo ad esempio > > a = " pippo $$" > > > > Si può avere il testo corretto con il seguente comando > > b = a.replace(“$$<“, "\\[<“).replace(“>$$”, “>\\]").replace(“$<”, > “\\(<”).replace(“>$”, “>\\)”) > > Grazie per le indicazioni, però non mi sono spiegato bene. Con > "" intendevo una qualunque formula matematica LaTeX: > > Il testo da modificare potrebbe essere: > > \begin{definizione} > $$ > m \times n = \begin{cases} > 0 & se \quad n = 0\\ > m & se \quad n = 1\\ > \underbrace{m + m + \dots + m}_{\text{n volte}} & \mbox{ negli altri casi} > \end{cases}$$ > \end{definizione} > > \begin{itemize*} > \item \emph{Commutativa}: $a \cdot b = b \cdot a$ > \item \emph{Associativa}: $(a \cdot b) \cdot c = a \cdot (b \cdot c)$ > \item \emph{Elemento neutro} $a \cdot 1 = 1 \cdot a = a$ > \end{itemize*} > > \begin{definizione} > Dati due numeri naturali~$m$ e~$n$, con~$n \neq 0$, la divisione associa > un terzo numero naturale~$q$, se esiste, che moltiplicato per ad~$n$ dà > come prodotto~$m$. > Si scrive~$n : m = q$. > \end{definizione} > > e dovrebbe diventare: > > \begin{definizione} > \[ > m \times n = \begin{cases} > 0 & se \quad n = 0\\ > m & se \quad n = 1\\ > \underbrace{m + m + \dots + m}_{\text{n volte}} & \mbox{ negli altri casi} > \end{cases}\] > \end{definizione} > > \begin{itemize*} > \item \emph{Commutativa}: \(a \cdot b = b \cdot a\) > \item \emph{Associativa}: \((a \cdot b) \cdot c = a \cdot (b \cdot c)\) > \item \emph{Elemento neutro} \(a \cdot 1 = 1 \cdot a = a\) > \end{itemize*} > > \begin{definizione} > Dati due numeri naturali~\(m\) e~\(n\), con~\(n \neq 0\), la divisione > associa > un terzo numero naturale~\(q\), se esiste, che moltiplicato per ad~\(n\) dà > come prodotto~\(m\). > Si scrive~\(n : m = q\). > \end{definizione} > > Quindi dovrei identificare una coppia di coppie di dollari e > trasformare la prima con la stringa: "\[" e la seconda con la stringa > "\]": > > $$a^2=b^2+c^2$$ ---> \[a^2=b^2+c^2\] > e > $5+7=12$ ---> \(5+7=12\) > > È per questo che pensavo fosse più un lavoro da espressioni regolari > che da semplice sostituzione. > > 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 > https://lists.python.it/mailman/listinfo/python > ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Ricerca e sostituzione con regex
Ciao, si potresti usare le espressioni regolari, ma sarà il caldo a farmi ragionare così... utilizzerei due "funzioncine" con lo split e un ciclo pari/dispari dove pari, inserisci l'apertura e dispari la chiusura degli elementi. > leo ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Ricerca e sostituzione con regex
Il giorno dom 16 giu 2019 alle ore 14:06 Giovanni Vittorio Spina ha scritto: > > Ponendo ad esempio > a = " pippo $$" > > Si può avere il testo corretto con il seguente comando > b = a.replace(“$$<“, "\\[<“).replace(“>$$”, “>\\]").replace(“$<”, > “\\(<”).replace(“>$”, “>\\)”) Grazie per le indicazioni, però non mi sono spiegato bene. Con "" intendevo una qualunque formula matematica LaTeX: Il testo da modificare potrebbe essere: \begin{definizione} $$ m \times n = \begin{cases} 0 & se \quad n = 0\\ m & se \quad n = 1\\ \underbrace{m + m + \dots + m}_{\text{n volte}} & \mbox{ negli altri casi} \end{cases}$$ \end{definizione} \begin{itemize*} \item \emph{Commutativa}: $a \cdot b = b \cdot a$ \item \emph{Associativa}: $(a \cdot b) \cdot c = a \cdot (b \cdot c)$ \item \emph{Elemento neutro} $a \cdot 1 = 1 \cdot a = a$ \end{itemize*} \begin{definizione} Dati due numeri naturali~$m$ e~$n$, con~$n \neq 0$, la divisione associa un terzo numero naturale~$q$, se esiste, che moltiplicato per ad~$n$ dà come prodotto~$m$. Si scrive~$n : m = q$. \end{definizione} e dovrebbe diventare: \begin{definizione} \[ m \times n = \begin{cases} 0 & se \quad n = 0\\ m & se \quad n = 1\\ \underbrace{m + m + \dots + m}_{\text{n volte}} & \mbox{ negli altri casi} \end{cases}\] \end{definizione} \begin{itemize*} \item \emph{Commutativa}: \(a \cdot b = b \cdot a\) \item \emph{Associativa}: \((a \cdot b) \cdot c = a \cdot (b \cdot c)\) \item \emph{Elemento neutro} \(a \cdot 1 = 1 \cdot a = a\) \end{itemize*} \begin{definizione} Dati due numeri naturali~\(m\) e~\(n\), con~\(n \neq 0\), la divisione associa un terzo numero naturale~\(q\), se esiste, che moltiplicato per ad~\(n\) dà come prodotto~\(m\). Si scrive~\(n : m = q\). \end{definizione} Quindi dovrei identificare una coppia di coppie di dollari e trasformare la prima con la stringa: "\[" e la seconda con la stringa "\]": $$a^2=b^2+c^2$$ ---> \[a^2=b^2+c^2\] e $5+7=12$ ---> \(5+7=12\) È per questo che pensavo fosse più un lavoro da espressioni regolari che da semplice sostituzione. 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 https://lists.python.it/mailman/listinfo/python
Re: [Python] Ricerca e sostituzione con regex
Ponendo ad esempio a = " pippo $$" Si può avere il testo corretto con il seguente comando b = a.replace(“$$<“, "\\[<“).replace(“>$$”, “>\\]").replace(“$<”, “\\(<”).replace(“>$”, “>\\)”) Se a è il testo completo con la vecchia sintassi, b è il testo con la sintassi sostituita. L’ordine del replace è fondamentale per evitare che venga sostituito il testo $$< con $\(< saltando il primo dollaro. Le doppie \\ servono per identificare la \ e non un carattere speciale, es \n come accapo. Puoi salvare il risultato su un file: Handle = open(“nomefile.ext”, “wb”) Handle.write(b) Handle.close() E hai il nuovo testo pronto. Ciao V > Il giorno 16 giu 2019, alle ore 11:20, Daniele Zambelli > ha scritto: > > "" > "\[\]" ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
[Python] Ricerca e sostituzione con regex
Salve a tutti. Sto curando la pubblicazione del testo libero di matematica per le superiori Matematica Dolce (bitbucket.org/zambu/matematicadolce). I sorgenti sono in LaTeX. Un gruppo dell'università di Torino (http://www.integr-abile.unito.it) ha scritto un pacchetto per LaTeX per rendere i testi di matematica più facilmente fruibili dai ciechi (http://www.integr-abile.unito.it/axessibility/). Questo pacchetto prevede che le formule siano indicate dai simboli: "\(", "\)", "\[" e "\]", ma in LaTeX c'è anche la possibilità, di usare i vecchi simboli: "$" e "$$". Molti dei sorgenti del libro usano i vecchi simboli (per altro ancora molto utilizzati) ora io vorrei scrivere un programmino che mi passi tutti i file sorgenti .tex e operi le seguenti sostituzioni: "" > "\[\]" "$$" > "\(\)" Osservazione: può anche essere scritta su più righe. Così, a occhio direi che lo strumento adatto da usare sono le espressioni regolari strumento che uso raramente e su cui sono molto ignorante. Qualcuno può aiutarmi a scrivere la funzione che dato un testo produca un testo con le precedenti sostituzioni? Grazie per l'attenzione e per qualunque indicazione vogliate darmi. -- 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 https://lists.python.it/mailman/listinfo/python