Éléments d'une expression arithmétique

Dans un terminal Python il est possible de saisir des expressions arithmétiques, des « calculs », afin de les exécuter.

🐍 Console Python
>>> 2 +3* 4.5
15.5

Cette opération a l'air anodine, mais elle n'est pas si immédiate à effectuer pour Python.

L'une des étapes indispensables est d'analyser l'expression 2 +3* 4.5 afin d'en extraire les différents jetons (les anglo-saxons parlent de tokens comme dans cette page) : 2, +, 3, * et 4.5. Le but de cet exercice est d'effectuer cette analyse.

Remarque

On ne va pas procéder exactement comme Python mais l'idée générale reste la même.

On se donne donc des expressions arithmétiques, chaines de caractères Python, composées de :

  • nombres entiers ou décimaux (le séparateur décimal est le point '.') ;
  • de symboles d'opérations : '+', '-', '*' et '/';
  • de parenthèses '(' et ')' ;
  • d'espaces ' ' placées entre les jetons, mais pas toujours (voir remarque ci-dessous).

Remarque

On considère que les expressions arithmétiques proposées sont bien formées et correspondent donc à des calculs valides.

Par contre, les différents jetons (nombres et symboles) peuvent être séparés par zéro, un ou plusieurs espaces.

On demande d'écrire la fonction analyse qui prend en argument une telle expression et renvoie la liste des jetons, chacun étant une chaine de caractères. Les espaces seront ignorées.

Exemples
>>> analyse("35.896 ")
["35.896"]
>>> analyse("3*   5+8")
["3", "*", "5", "+", "8"]
>>> analyse("3.9  * (5+8.6)")
["3.9", "*", "(", "5", "+", "8.6", ")"]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:LpM%(40ed3; 1Ejo5_An)Bh]6,qc[y!FCuv8Hi2+xmYsU7=wlSIatf-9O|Rrg.*çé?Pkbè/050k0j0$0#0N0Y0T0n0D0Y0#0T0T0W010$0N0d010406050T0J0R0R0#0-0F040Z0r0Y0J1c0r0v0n020#0R0d0m0n0,0j1m0-0C0J0j0T050{1j1l1n1p1h0d041N1U051X0{1X1Z1U1h0k0N0K1416181a0y0N0.0y0Y1;0y0$1f050 0_0Y0j1,1719011:1=1@1=0$1}1 1{0$0_0r0k1p1|0-1V0$0y141s0T0d0#0v1a0O01211.010%110j0v1A0j1{2p2r2w232z1 2C0R2E040a0n0@0-0r0d0r0T0N1v1x0}2n0-0-0j0D2Z1N2G0v1V0{2l2/0$2j2i2k0k2I1a1@0v2B2W1{1)1+15222|0N2~0v2f1*1{0d2(1V2-2/3g1i2q1x342x390-1m0Y1f0n0o2,3k1g3j2H3m233o3q3s0O3v2r3x2-2{013C0#3r040n0l3G2.1h3J3A1a3M3O0n0h3S3I3k3K3Y3s0s3$3U3(3W3L0r3p3N3s0A3-3y3l1-3B3=3D3P0V3`3V3}3X3 3@3P0L433/453;3?3Z0)4b3z4d3*040o0i4i3|354e400o3u1O3w3.4j4r4l0o3F4w3H4y4q3n473O0o3R4E3T3{3)4J1f0o3#4N3%4z4I4f4S3,4V4G4Q4Z4m3_4$4P3:4B424V1W3e1N322=0k2_3K0D2f2O0|1*1V3d0j3f3w3$054}0}554X3B1f0Z0S0e0x0*0c0p0Z3$0n4-4d0r1f0W5n5p4r0T2u04010P0(0:0{0g0w013-064%3:0^1f0}0%57444r0X3s5Q4c4A0%1f2r3N0F0T0j5V5c1a1e040g5)4H5d040j0Q53180N1w5/3K5,0w0b3-0n625o5R3n1f0j1 2N0v0$1M4V645W2x5r045t6e5v2x5,0E0z61636m5;0$1G0d5u65236i6k3g6f5*015x1f015H4$636E5:1a5M040%3=6y6g5;0D1n0#2*0j2(6U6F0r5T04376%6O3L675@2(5_5{4;6z5+1f606L6M6s6_016Q0N5P6l700v1f6X0-6Z6v6$756V1a6)1f6,7e6F771q5g5i5k5m6^7f015,6|3g066~7z6N3K72746D6t3X0_1f2L5|3:5,5.7s7l1f6v1B7L4d5~6-3K6i020.0$0m7X3:0R0N1f4o7P6.7v6r7A7A7G6/5=692B6c7U4r6i0/7}66040#0d0d2B0k81237N893X7R6w8c7u1f0w7;7=6~7@7m7S6x7k6.6B7(4d6H5z6K7x8l6 7t7m681G7{6d3i707 8g7m84860v887.5}1f7O8I8C786Y6!7d8V6F7W6}7z7@6Q68738u4A8X7a8Z5(8r7Y1f0G6C3w7B3:8w2v8y56707:8(8l8n8e7T8@3:6i0P8{3H8}4k8:7b6#8?8z8B6F7D8.3n7I047K8R7M8T8L988q8#7/8i9q6A1f7!7$9E1a7*7,8g949m8)76677`6b8H927t8K9v9h8385879N9x9Z8/048p9(048j958*1f2(0$0J0-0v9J7^8E6a7|4,0{59544=a40{4^1N0$4`a92@2:2e2g2=0#1~a64^1T5b6.2(0R0t0%0#0^0j0t0y0l1f1F1H1J1L0n7w561!3x1U0c003N0.3=2Y0y2N0n1L0$2I0NaCaSaU2~0n3d0=5%6b202q132#1)0%2z0D0J0Y0$a%0n1m0q0j9_1L0/0n0*1x1 0n9@2T0J0K202#as0;1w0n2?0`133d0r0D0yb92r13b36X0Ya;0Y0n0}137c2Na,20160n1j2Y200#0J1)0r0(7b1*b9200I1w0X0#0FaYbubn0nbB4}1B6=2Xbd051G040,0J0v0(0c2B7#2m0p0v59370.1Nb)80aHamb?2z0v0BbXaD050#0n0y2(0%1/290d0T0b0{0{0%0-0/0X0N0^1d0j1)0#0/3=0.0{cmco0{0p6;1Lb$0v0t0-0f0I0l0f0u0)0.a=0NcHcJ0u0L2(6:5^cD130-0=cN1@0`6=1N0#3P863p0~6v6bbu20cZ0T0rbH2(b4840N0}9 14a*2T1~0`2Na 0Ua!5?cW5`1xcZc#0Nc%20aT0nb,20bk10a!2#797bdga,0=0D0-1*2raU0kaL1u6=140ydnaDdp8Y0$dsa 0@1naS0Q6wb3584~04dm0$0g1w0w0?0T0?1Na33P0ka%1;a!1 130R0r6c5od)dWd(dUc3dT5adW6@d)d|d^dFa0d)bUd}54d 0v6dd)b}1%1Y04b1dj1c1@5%0n3N3=bo00d9b#dbb4c!cOdgd@dU090k0P0g0?0b090/eB0Pd!0+0E0P095C095E0w6qa2dUa 0!btdi2V5_ajc;beaT6#d029dhcB6?dcewc$c`1j0-c4bCbEe(c6c8cacc0$cecg0{2(0.5?4n0o0/bZf50{0)0F0M0H0l0K0{0o9?0jf70Qf9c)04eeaI04b/2n2#0@0F2lbd0}0K0N7{en0YepaE1W3x323K251?1^1`an3K2K2B2D1f2Q0Zdv1daUfAfC9{4;53an3h56d)8*7m0N1B3=0$8g6*5o9*3n7m8!4x9=045Of{5Uf~3B5Y832C0Y5$9l9W8$9)9B3)cVet6@gj9w9/aF4F6Mg39@9_f+7F9R04g13H7@9Ygo9!c10k3N0Y9.8Ugg6.8 eJeEeGeIeCeLeNeP0:eR5F0z91gC931f0B9|8De/cD9.9:7xd`5aa52/al4@0~101204.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:LpM%(40ed3; 1Ejo5_An)Bh]6,qc[y!FCuv8Hi2+xmYsU7=wlSIatf-9O|Rrg.*çé?Pkbè/050k0j0$0#0N0Y0T0n0D0Y0#0T0T0W010$0N0d010406050T0J0R0R0#0-0F040Z0r0Y0J1c0r0v0n020#0R0d0m0n0,0j1m0-0C0J0j0T050{1j1l1n1p1h0d041N1U051X0{1X1Z1U1h0k0N0K1416181a0y0N0.0y0Y1;0y0$1f050 0_0Y0j1,1719011:1=1@1=0$1}1 1{0$0_0r0k1p1|0-1V0$0y141s0T0d0#0v1a0O01211.010%110j0v1A0j1{2p2r2w232z1 2C0R2E040a0n0@0-0r0d0r0T0N1v1x0}2n0-0-0j0D2Z1N2G0v1V0{2l2/0$2j2i2k0k2I1a1@0v2B2W1{1)1+15222|0N2~0v2f1*1{0d2(1V2-2/3g1i2q1x342x390-1m0Y1f0n0o2,3k1g3j2H3m233o3q3s0O3v2r3x2-2{013C0#3r040n0l3G2.1h3J3A1a3M3O0n0h3S3I3k3K3Y3s0s3$3U3(3W3L0r3p3N3s0A3-3y3l1-3B3=3D3P0V3`3V3}3X3 3@3P0L433/453;3?3Z0)4b3z4d3*040o0i4i3|354e400o3u1O3w3.4j4r4l0o3F4w3H4y4q3n473O0o3R4E3T3{3)4J1f0o3#4N3%4z4I4f4S3,4V4G4Q4Z4m3_4$4P3:4B424V1W3e1N322=0k2_3K0D2f2O0|1*1V3d0j3f3w3$054}0}554X3B1f0Z0S0e0x0*0c0p0Z3$0n4-4d0r1f0W5n5p4r0T2u04010P0(0:0{0g0w013-064%3:0^1f0}0%57444r0X3s5Q4c4A0%1f2r3N0F0T0j5V5c1a1e040g5)4H5d040j0Q53180N1w5/3K5,0w0b3-0n625o5R3n1f0j1 2N0v0$1M4V645W2x5r045t6e5v2x5,0E0z61636m5;0$1G0d5u65236i6k3g6f5*015x1f015H4$636E5:1a5M040%3=6y6g5;0D1n0#2*0j2(6U6F0r5T04376%6O3L675@2(5_5{4;6z5+1f606L6M6s6_016Q0N5P6l700v1f6X0-6Z6v6$756V1a6)1f6,7e6F771q5g5i5k5m6^7f015,6|3g066~7z6N3K72746D6t3X0_1f2L5|3:5,5.7s7l1f6v1B7L4d5~6-3K6i020.0$0m7X3:0R0N1f4o7P6.7v6r7A7A7G6/5=692B6c7U4r6i0/7}66040#0d0d2B0k81237N893X7R6w8c7u1f0w7;7=6~7@7m7S6x7k6.6B7(4d6H5z6K7x8l6 7t7m681G7{6d3i707 8g7m84860v887.5}1f7O8I8C786Y6!7d8V6F7W6}7z7@6Q68738u4A8X7a8Z5(8r7Y1f0G6C3w7B3:8w2v8y56707:8(8l8n8e7T8@3:6i0P8{3H8}4k8:7b6#8?8z8B6F7D8.3n7I047K8R7M8T8L988q8#7/8i9q6A1f7!7$9E1a7*7,8g949m8)76677`6b8H927t8K9v9h8385879N9x9Z8/048p9(048j958*1f2(0$0J0-0v9J7^8E6a7|4,0{59544=a40{4^1N0$4`a92@2:2e2g2=0#1~a64^1T5b6.2(0R0t0%0#0^0j0t0y0l1f1F1H1J1L0n7w561!3x1U0c003N0.3=2Y0y2N0n1L0$2I0NaCaSaU2~0n3d0=5%6b202q132#1)0%2z0D0J0Y0$a%0n1m0q0j9_1L0/0n0*1x1 0n9@2T0J0K202#as0;1w0n2?0`133d0r0D0yb92r13b36X0Ya;0Y0n0}137c2Na,20160n1j2Y200#0J1)0r0(7b1*b9200I1w0X0#0FaYbubn0nbB4}1B6=2Xbd051G040,0J0v0(0c2B7#2m0p0v59370.1Nb)80aHamb?2z0v0BbXaD050#0n0y2(0%1/290d0T0b0{0{0%0-0/0X0N0^1d0j1)0#0/3=0.0{cmco0{0p6;1Lb$0v0t0-0f0I0l0f0u0)0.a=0NcHcJ0u0L2(6:5^cD130-0=cN1@0`6=1N0#3P863p0~6v6bbu20cZ0T0rbH2(b4840N0}9 14a*2T1~0`2Na 0Ua!5?cW5`1xcZc#0Nc%20aT0nb,20bk10a!2#797bdga,0=0D0-1*2raU0kaL1u6=140ydnaDdp8Y0$dsa 0@1naS0Q6wb3584~04dm0$0g1w0w0?0T0?1Na33P0ka%1;a!1 130R0r6c5od)dWd(dUc3dT5adW6@d)d|d^dFa0d)bUd}54d 0v6dd)b}1%1Y04b1dj1c1@5%0n3N3=bo00d9b#dbb4c!cOdgd@dU090k0P0g0?0b090/eB0Pd!0+0E0P095C095E0w6qa2dUa 0!btdi2V5_ajc;beaT6#d029dhcB6?dcewc$c`1j0-c4bCbEe(c6c8cacc0$cecg0{2(0.5?4n0o0/bZf50{0)0F0M0H0l0K0{0o9?0jf70Qf9c)04eeaI04b/2n2#0@0F2lbd0}0K0N7{en0YepaE1W3x323K251?1^1`an3K2K2B2D1f2Q0Zdv1daUfAfC9{4;53an3h56d)8*7m0N1B3=0$8g6*5o9*3n7m8!4x9=045Of{5Uf~3B5Y832C0Y5$9l9W8$9)9B3)cVet6@gj9w9/aF4F6Mg39@9_f+7F9R04g13H7@9Ygo9!c10k3N0Y9.8Ugg6.8 eJeEeGeIeCeLeNeP0:eR5F0z91gC931f0B9|8De/cD9.9:7xd`5aa52/al4@0~101204.
Conseil (1)

On pourra utiliser une variable temporaire afin de stocker les différents caractères composant un nombre.

Conseil (2)

Avant d'ajouter un symbole (opérateur ou parenthèse), on vérifiera que la variable temporaire est non vide. Si c'est le cas, on pourra ajouter un nombre et le symbole à la liste des jetons.

Conseil (3)

Un nombre n'est ni un symbole (opérateur ou parenthèse), ni une espace.