[Python] Ricerca e sostituzione con regex

Daniele Zambelli daniele.zambelli a gmail.com
Mar 18 Giu 2019 11:57:36 CEST


Il giorno lun 17 giu 2019 alle ore 23:16 Marco Beri
<marcoberi a gmail.com> ha scritto:
> [...]
> Positive and Negative Lookbehind
>
> Lookbehind has the same effect, but works backwards. It tells the regex engine to temporarily step backwards in the string, to check if the text inside the lookbehind can be matched there. (?<!a)b matches a "b" that is not preceded by an "a", using negative lookbehind. It doesn't match cab, but matches the b (and only the b) in bed or debt. (?<=a)b(positive lookbehind) matches the b (and only the b) in cab, but does not match bed or debt.

Grazie per la grande disponibilità!

Ora i dollari esterni alle espressioni vengono riconosciuti regolarmente,
Ma se il dollaro è all'interno di un'espressione la sostituzione non
viene fatta.

Per comodità copioincollo l'intero programmino con i test compresi:

8<---------------------------------------------------
import re

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\)
>>> print(translate(r'dollaro: \$ espressione senza dollaro:~$3^2+4^2=5^2$'))
dollaro: \$ espressione senza dollaro:~\(3^2+4^2=5^2\)
>>> print(translate(r'''dollaro: \$, espressione senza \$:
... $$a^2=b^2+c^2$$'''))
dollaro: \$, espressione senza \$:
\[a^2=b^2+c^2\]
>>> print(translate(r'''dollaro: \$, espressione con \$:
... $$a^2=\$b^2+c^2$$'''))
dollaro: \$, espressione con \$:
\[a^2=\$b^2+c^2\]
>>> print(translate(r'dollaro: \$ espressione con dollaro:~$3^2+4^2=\$5^2$'))
dollaro: \$ espressione con dollaro:~\(3^2+4^2=\$5^2\)
"""
##    result = re.sub(r'\\\$', r'd_o_ll_a_ro', string, flags=re.S)
    result = re.sub(r'(?<!\\)\$\$(.[^\$\$]*)(?<!\\)\$\$',
                    r'\[\1\]',
                    string.rstrip(), flags=re.S)
    result = re.sub(r'(?<!\\)\$(.[^(?<!\\)\$]*)(?<!\\)(?<!\\)\$',
                    r'\(\1\)',
                    result, flags=re.S)
##    result = re.sub(r'd_o_ll_a_ro', r'\\\$', string)
    return result


TEST = True
#TEST = False

if __name__ == '__main__':
    if TEST:
        import doctest
        OPTFLG = doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
        doctest.testmod(optionflags=OPTFLG, verbose=True)
    else:
        main()
--------------------------------------------------->8

Penso che l'errore sia nell'espressione all'interno della quadra:

[^(?<!\\)\$]

Ma non capisco come sistemarlo.

-- 

Daniele

www.fugamatematica.blogspot.com

    giusto!
    nel verso
    forse è perché non guardiamo le cose
    Quando non ci capiamo,


Maggiori informazioni sulla lista Python