OVH Cloud OVH Cloud

changer parenthèses (fonction de P. Ivaldi)

17 réponses
Avatar
Stéphane Dutailly
Bonjour à tous,

J'explique un peu mon titre. Il me semble avoir vu un jour en parcourant
des fichiers de Philippe, une commande permettant de changer $(blabla)$
en $\left(blabla\right)$ dans un fichier .tex.
Je ne sais pas si j'ai rêvé cela (je ne crois pas) mais en tous cas à
l'époque c'était du chinois pour moi (je n'ai pas pris de notes, et pas
moyen de retrouver le fichier...) mais maintenant j'essaierais bien.
Est-ce que quelqu'un voit à quoi je fais référence? Philippe, si vous
passez par là...

Merci à tous,
Stéphane

7 réponses

1 2
Avatar
Paul Gaborit
À (at) Wed, 04 Jan 2012 12:01:50 +0100,
Daimrod écrivait (wrote):

Les délimiteurs, comme les parenthèses, vont par pair, donc il faut les
manipuler ensemble. Mais une expression régulière ne permet pas de gérer
des délimiteurs lorsqu'ils sont imbriqués.



Pour être plus précis, une expression régulière ne permet pas de gérer
des délimiteurs lorsqu'ils sont imbriqués sur un nombre de niveaux non
limité.

Si on sait que l'imbrication ne dépasse pas n niveaux alors on peut
créer une expression régulière qui marche jusqu'au niveau n.

Par ailleurs, il existe des moteurs de regex étendus (comme celui de
Perl) qui gèrent cela.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
JJ. Rétorré
Stéphane Dutailly disait le 01/03/12 que :

Un simple(?) query-replace-regexp peut le faire.
C-M-% $(([^$]*))$<RET> $left(1right)$<RET>
On peut toujours en faire une fonction interactive, ou plus simplement
une macro de clavier.




Merci Jean-Jacques, je n'envisageais pas cela car pour l'instant je
n'ai jamais cherché à utiliser/comprendre les expressions régulières
(cela me paraît encore très obscur) et puis mon idée est aussi
d'utiliser le code pour l'adapter; mais du coup, je vais peut-être
pouvoir aussi me lancer sur les expressions régulières ;-)

Stéphane




Ma science des regexp est toute récente, mais je trouve que c'est
tellement puissant que c'est vraiment indispensable.
Je me suis lancé grâce à ce newsgroup et au TeXnicien de surface qui m'a
donné un sérieux coup de main.


--
JJR.
Avatar
Stéphane Dutailly
Est-ce que quelqu'un voit à quoi je fais référence?



Oui :)

Philippe, si vous passez par là...



http://tinyurl.com/6uz8899




Super! Merci beaucoup :-) :-)

Stéphane
Avatar
Pascal J. Bourguignon
Daimrod writes:

Ah j'avais oublié les regexp étendues, mais je ne les ai jamais
utilisées et je ne crois pas quelles soient disponibles dans emacs.



Par définition, des regexp "étendues" ne sont plus des expressions
régulières!


Cependant, même pour n niveau d'imbrication (n ≥ 3) ou avec des regexp
étendues, je choisirai plutôt de faire une fonction car je trouve
qu'un algorithme sera plus simple à comprendre qu'une expression
régulière. Mais c'est peut être une question d'habitude.



--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Avatar
Daimrod
Paul Gaborit writes:

À (at) Wed, 04 Jan 2012 12:01:50 +0100,
Daimrod écrivait (wrote):

Les délimiteurs, comme les parenthèses, vont par pair, donc il faut les
manipuler ensemble. Mais une expression régulière ne permet pa s de gérer
des délimiteurs lorsqu'ils sont imbriqués.



Pour être plus précis, une expression régulière ne pe rmet pas de gérer
des délimiteurs lorsqu'ils sont imbriqués sur un nombre de nive aux non
limité.

Si on sait que l'imbrication ne dépasse pas n niveaux alors on peut
créer une expression régulière qui marche jusqu'au niveau n.




En effet, merci de le préciser.

Par ailleurs, il existe des moteurs de regex étendus (comme celui de
Perl) qui gèrent cela.



Ah j'avais oublié les regexp étendues, mais je ne les ai jamais
utilisées et je ne crois pas quelles soient disponibles dans emacs.

Cependant, même pour n niveau d'imbrication (n ≥ 3) ou avec de s regexp
étendues, je choisirai plutôt de faire une fonction car je trouve
qu'un algorithme sera plus simple à comprendre qu'une expression
régulière. Mais c'est peut être une question d'habitude.
Avatar
Daimrod
"Sebastien Vauban" writes:

Bonjour Daimrod,


Pas sûr de comprendre la signification exacte de "régulià ¨re". Mais l'on peut
très bien mettre des groupes dans des groupes, via les parenthà ¨ses. Je n'ai
pas de "use case" précis sous la main, mais des choses du style

(abc|deb(.*)fin)

sont envisageables (je n'ai pas mis les escapes). Et l'on peut accà ©der à
l'expression mère ou à l'expression fille (ici, ce qui serait au milieu, entre
"deb" et "fin").



Je fais référence à la notion de grammaire et d'expressio n régulière
définie par la hiérarchie de Chomsky[1].

Les délimiteurs, comme les parenthèses, vont par pair, donc il faut les
manipuler ensemble. Mais une expression régulière ne permet pa s de gérer
des délimiteurs lorsqu'ils sont imbriqués.

(1 (2 3 4 (5 6) 7 8) 9 10)
----------------------^ Si mon curseur se trouve ici je veux manipuler
^------------------------^ ces parenthèses, pas les autres.

On « sent » bien que pour atteindre le bon délimiteur gau che il faut
mémoriser le nombre de délimiteur droit, et avoir le même nombre de
délimiteur gauche, plus un, qui serra le délimiteur cherchà ©. Bien
entendu, dans le cas où l'on rechercherait le délimiteur droit , on
inverserait les termes.

C'est cette notion de mémoire que ne permette pas les expressions ou
grammaire régulière. Pour cela, il faut utiliser un automate à pile.

[1]: https://secure.wikimedia.org/wikipedia/fr/wiki/Hiérarchie_de_ Chomsky



Merci pour ce rappel de fondamentaux auxquels j'ai, sans doute, aussi à ©té
exposé dans le passé...

Sincèrement,
Seb



Pas de problème, c'est le genre de truc qui ne sert pas tout le temps,
mais dans notre cas, ça peut nous éviter de trop faire chauffer l es
neurones à chercher une expression régulière qui n'existe pa s dans le
cas général :)

PS: de toute façon je triche, puisque j'ai étudié ça il y a moins
de deux mois alors c'est encore frais.
Avatar
Paul Gaborit
À (at) Wed, 04 Jan 2012 18:19:54 +0100,
Daimrod écrivait (wrote):

Paul Gaborit writes:

Par ailleurs, il existe des moteurs de regex étendus (comme celui de
Perl) qui gèrent cela.



Ah j'avais oublié les regexp étendues, mais je ne les ai jamais
utilisées et je ne crois pas quelles soient disponibles dans emacs.



Elles ne sont malheureusement pas disponibles dans emacs... et ne le
seront sans doute jamais ou alors de manière très détournà ©e car il faut
assurer la compatibilité avec l'existant.

Cependant, même pour n niveau d'imbrication (n ≥ 3) ou avec des regexp
étendues, je choisirai plutôt de faire une fonction car je trou ve
qu'un algorithme sera plus simple à comprendre qu'une expression
régulière. Mais c'est peut être une question d'habitude.



Écrire une regexp qui marche jusqu'à un niveau n d'imbrication
(avec n > 1) est généralement un horreur. En revanche, avec la sy ntaxe
étendue qui permet de matcher les délimiteurs bien équilibr és, c'est un
régal. Et en terme d'efficacité, les performances sont très bonnes.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
1 2