[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