/usr/share/pyshared/pyromaths/outils/Priorites2.py is in pyromaths 11.05.1b2-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | # -*- coding: utf-8 -*-
import re
## TODO Gestion des signes qui se suivent ( 3+-5 ou 3*-5 )
def priorites(calcul, pre = "", post = "", solution = []):
if not solution: solution = [calcul]
recherche_parentheses = r"""
^(.*) #des calculs dans le groupe 0
( #début du groupe 1
\( #commence par une parenthèse ouvrante
(?: #regroupement 0 (non groupe)
[\+\-]? #un éventuel signe
(?: #regroupement 1 (non groupe)
\( #une parenthèse ouvrante
[\+\-]? #un éventuel signe
\d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une éventuelle
#partie décimale et un éventuel exposant
\) #une parenthèse fermante
| #ou
\d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une éventuelle
#partie décimale et un éventuel exposant
| #ou
\w+ #un littéral
) #fin du regroupement 1
[\+\-\*/]+ #un opérateur
)+ #fin du regroupement 0 (présent au moins
#un fois)
[\+\-]? #un éventuel signe
(?: #regroupement 0 (non groupe)
\( #une parenthèse ouvrante
[\+\-]? #un éventuel signe
\d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une éventuelle
#partie décimale et un éventuel exposant
\) #une parenthèse fermante
| #ou
\d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une éventuelle
#partie décimale et un éventuel exposant
| #ou
\w+ #un littéral
) #fin du regroupement 0 présent une seule fois
\) #fini par une parenthèse fermante
) #fin du groupe 1
(.*)$ #des calculs pour finir
"""
test = re.search(recherche_parentheses, calcul, re.VERBOSE)
while test:
sous_calcul = test.groups()
(calcul, solution) = priorites_operations(sous_calcul[1],
sous_calcul[0],
sous_calcul[2],
solution)
calcul = solution[-1]
test = re.search(recherche_parentheses, calcul, re.VERBOSE)
calcul, solution = priorites_operations(calcul, pre, post, solution)
return(solution)
def traite_operation(operateur, calcul, pre, post, solution):
pattern = r"""
( #groupe 0
^\(* #le calcul est au début (aux parenthèses près)
#les signes +/- font parti du groupe 2
| #ou
^.*?[\+\-]? #il y a des calculs avant, le 1e signe +/-
#est un opérateur
) #fin du groupe 0
( #groupe 1
(?: #regroupement 1 (non groupe)
[\+\-]? #un éventuel signe
\( #une parenthèse ouvrante
[\+\-]? #un éventuel signe
\d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une
#éventuelle partie décimale et un
#éventuel exposant
\) #une parenthèse fermante
| #ou
[\+\-]? #un éventuel signe
\d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une
#éventuelle partie décimale et un
#éventuel exposant
| #ou
\w+ #un littéral
) #fin du regroupement 1
{0} #opération
(?: #regroupement 2 (non groupe)
[\+\-]? #un éventuel signe
\( #une parenthèse ouvrante
[\+\-]? #un éventuel signe
\d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une
#éventuelle partie décimale et un
#éventuel exposant
\) #une parenthèse fermante
| #ou
[\+\-]? #un éventuel signe
\d+\.?\d*(?:e[\+\-]\d+)? #on cherche un nombre avec une
#éventuelle partie décimale et un
#éventuel exposant
| #ou
\w+ #un littéral
) #fin du regroupement 2
) #fin du groupe 1
(.*?)$ #tout le reste
""".format(operateur)
test = re.search(pattern, calcul, re.VERBOSE)
while test:
sous_calcul = test.groups()
sous_resultat = eval(sous_calcul[1])
if (sous_calcul[0] and sous_calcul[0][-1] == '(') and \
(sous_calcul[2][0] and sous_calcul[2][0] == ')') and \
(post[:2] != '**' or sous_resultat > 0):
#permet de supprimer les parenthèses
solution.extend([pre +
sous_calcul[0][:-1] +
str(sous_resultat) +
sous_calcul[2][1:] +
post])
else:
solution.extend([pre +
sous_calcul[0] +
str(sous_resultat) +
sous_calcul[2] +
post])
calcul = sous_calcul[0] + str(sous_resultat) + sous_calcul[2]
test = re.search(pattern, calcul, re.VERBOSE)
return (calcul, pre, post, solution)
def priorites_operations(calcul, pre = "", post = "", solution = []):
calcul, pre, post, solution = traite_operation("\*\*", calcul, pre,
post, solution)
calcul, pre, post, solution = traite_operation("[\*/]", calcul, pre,
post, solution)
calcul, pre, post, solution = traite_operation("[\+\-]", calcul, pre,
post, solution)
return (calcul, solution)
for element in priorites("(2-5)**2+(5-2)**3+((3*4+5)*2+3*(32-5*7)**2)*5+17*(12-3*5)"):
print element
#print priorites("((-(-1)+-2)++3)")
#print priorites("4-((-1+-2)+3)")
#print priorites('8-(-5*(2-4))')
#print priorites("1+2+3+4")
#print priorites("-3**+2")
#print priorites("9+8*7")
#print priorites("8+1.3e+2")
|