[Python] Ricerca e sostituzione con regex

Daniele Zambelli daniele.zambelli a gmail.com
Dom 16 Giu 2019 19:32:18 CEST


Il giorno dom 16 giu 2019 alle ore 18:31 Lorenzo Buonanno
<buonanno.lorenzo a gmail.com> 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:
"$$<formula>$$"  ---->  "\[<formula>\]"
"$<formula>$"  ---->  "\(<formula>\)"
>>> print(translate(r'$$<formula>$$'))
\[<formula>\]
>>> print(translate(r'$<formula>$'))
\(<formula>\)
>>> 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,


Maggiori informazioni sulla lista Python