|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Conseil - Consultant en systèmes d'information Inscription : novembre 2011 Messages : 80 ![]() |
Bonjour les amis,
J'ai besoin d'extraire le dénominateur pour vérifier s'il est nul ou non, par exemple dans cet exemple "(5+3)/4*(3/(4-(2*2))" je veux récupérer les dénominateurs : 4 et (4-(2*2)). J'ai fé ca mais ca marche pas. Merci bien d'avance pour vos réponses. Code :
|
||
|
|
00
|
|
|
#2 | ||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
Bonjour
tu peux essayer avec ça (.*)(\/)([^\/]*)(.*) : bidule1 quelconque suivi de '/' suivi d'un bidule ne contenant pas de / , si il y a un deuxième / il sera contenu dans le buffer 4 (prxposn(regexp,4,string)) Code :
devrait marcher , et tu dois trouver ton dénominateur dans le buffer 2 (prxposn(regexp,2,string)) et si tu la transforme en 's/(.*)(\/)(.*)/$1[$3]$5/' tu dois retrouver ton dénominateur dans le buffer 3 (comme écrit dans ton code) Edit : enfin si il y a des choses que tu ne comprend ou qui mérite des précisions pose tes questions. |
||
|
|
00
|
|
|
#3 | ||
|
Candidat au titre de Membre du Club
![]() Conseil - Consultant en systèmes d'information Inscription : novembre 2011 Messages : 80 ![]() |
Merci Jerom pour votre réponse, j'ai utilisé le code suivant :
Code :
Denom -------- 8))) (2*6-(9/8))) (2-5/(2*6-(9/8))) Or je veux récupérer le résultat comme suit: 8,(2*6-(9/8)) et (2-5/(2*6-(9/8))), je ne sé po comment gérer le problème de parenthèses de fin.Merci Bien pour votre aide. |
||
|
|
00
|
|
|
#4 | ||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
Normal, c'est pas gérable en une seule expression régulière !
Enfin peut-être que si mais je ne sais pas faire là. C'est un problème typique de récursivité, mais je crois que les expressions prx de SAS ne le supporte pas (en tout cas je n'ai jamais vu aucun exemple...). Pour résoudre ton problème il faut combiner les recherches de parenthèses et la présence de divisions. Je vais supposer que l'écriture de tes expressions est de la forme A/(B) dès lors que B contient un des opérateurs suivants '+' '-' '*' '/' (j'espère que tu n'en as pas d'autres, mais bon ça pourra se modifier. Etape 1 Il faut d'abord transformer les 5/8 en 5/(8) on utilise l'expression régulière ratio_atome pour ce faire Etape 2 ensuite on repère des dénominateur parenthèses par l'expression régulière parenthese_ratio et on remplace les / par : et les () par [] le résultat sort dans la variable denom ensuite on repère les parenthèses non dénominateur par l'expression régulière parenthese_elementaire on remplace les () par [] le résultat sort dans la variable motif à chaque fois on "redresse" denom et motif en remplaçant :[] par /() et on remet dans la bonne écriture les 5/(8) à l'aide de l'expression régulière sup_ratio_atome ensuite on reboucle au début de l'étape 2 tant qu'il y a des choses à faire J'ai du utiliser 4 expressions régulières, il y a sans doute possibilité de les optimiser et éventuellement d'en réduire le nombre. Tout ça n'est sans doute pas optimal mais doit te permettre d'avancer. Code :
Code :
Enfin j'ai beaucoup compliqué par rapport à ta situation du post précédent, j'ai peut-être compliqué inutilement, mais c'est comme ça que ça m'est venu pour décortiquer proprement le texte. Peut-être suffisait-t-il de faire un tranwrd tout simple sur les ) pour enlever les duplications à la fin. A toi de voir. |
||||
|
|
30
|
|
|
#5 |
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
une modification
je te conseille de remplacer Code :
parenthese_elementaire=prxparse('s/(.*[^\/])(\()([^\(\)]*)(\))(.*)/$1[$3]$5/'); Code :
parenthese_elementaire=prxparse('s/(.*[^\/]|^)(\()([^\(\)]*)(\))(.*)/$1[$3]$5/'); le |^ indique 'ou début de chaine' '|'=ou et '^'=debut de chaine Edit : correction (.*[^\/|^]) en (.*[^\/]|^) |
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
Edit : mauvais post
|
|
|
00
|
|
|
#7 | ||
|
Candidat au titre de Membre du Club
![]() Conseil - Consultant en systèmes d'information Inscription : novembre 2011 Messages : 80 ![]() |
Code :
il donne le résultat : (8-7)) et 6)+(9/(8-7)) à la place de (8-7) et 6 |
||
|
|
00
|
|
|
#8 | ||||
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
Bonsoir,
c'est bien avec toi on fait des nocturnes ![]() J'obtiens ceci Code :
Code :
Parce que dans ton code l'expression régulière que l'on avait proposé dans un premier temps est trop "simpliste" je pense pour traiter ce que tu veux faire. Ca risque d'être compliqué d'obtenir ce que tu veux avec ton code actuel. Je t'en propose un qui semble faire ce que tu veux et tu ne l'utilise pas, pour quelle raison ? |
||||
|
|
00
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() Conseil - Consultant en systèmes d'information Inscription : novembre 2011 Messages : 80 ![]() |
Je l'utilise, merci Jerome, j'ai voulu juste mentionner que le bout de code que j'ai partagé ne prend po le cas général
|
|
|
00
|
|
|
#10 |
|
Membre éclairé
![]() statisticien Inscription : mai 2011 Messages : 213 ![]() |
Ah ok, je pensais que tu étais toujours à la recherche de l'expression régulière qui ferait tout en un.
Cela étant dit, en réfléchissant je pense qu'il y a peut être moyen d'avoir une seule expression régulière à la place des 4. Mais elle risque d'être très complexe à élaborer, et qui dit complexe, dit complexe a débugguer si elle marche pas, et donc, si on est pas un génie des regexp , beaucoup de temps... Enfin il ya quelques experts sur le forum, peut-être viendront ils en donner une ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com