Rechercher-remplacer : remplacer parenthèse par crochet

Nanane - 1 déc. 2023 à 17:43
m@rina Messages postés 20944 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 27 septembre 2024 - 6 déc. 2023 à 00:48

Bonjour, 

Dans un texte, j'ai plusieurs occurrences d'expressions de ce genre : (para. 7(1)) (les chiffres peuvent changer, mais la forme reste la même). 

Je veux remplacer les parenthèses externes par des crochets : [para. 7(1)]

J'ai trouvé comment rechercher l'expression : \(<*>\(<*>\)\).

Maintenant, je veux savoir comment faire le remplacement...

Pourriez-vous m'éclairer? Merci! 

3 réponses

m@rina Messages postés 20944 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 27 septembre 2024 11 329
5 déc. 2023 à 02:44

Bonjour

Oui, je peux faire un peu de sorcellerie, mais encore faudrait il que Nanane soit toujours intéressé car il n'a pas l'air de répondre aux propositions.

Avant tout, il faudrait poser quelques questions, en particulier le texte entre parenthèses commence-t-il toujours par le mot "para" ce qui simplifierait la solution. Est-ce que les chiffres entre () sont-ils toujours du même nombre ? Y a-t-il des espaces ? etc.

Partant de son exemple qui commence par para, on peut faire ça assez simplement :

Recherche : \((para*\([0-9]{1;3}\))\)

Remplacer par : [\1]

m@rina


1
brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024 2 399
5 déc. 2023 à 07:54

Bonjour,

Certes, mais en supposant comme je l'ai fait, et sans tes compétences, qu'il s'agit d'un document qui peut comporter de multiples occurrences qui peuvent présenter n'importe quelle chaîne du moment qu'il y a une double parenthèse et que celle interne peut comporter n'importe quel nombre?

J'avais envisagé en haut de mon commentaire en <9> une solution qui me paraissait devoir fonctionner mais qui crée les crochets en maintenant les parenthèses tandis que si par ailleurs je cherche à saucissonner un remplacement je me fais jeter par toute syntaxe du type \1\n(caractère) quand (caractère) n'est pas en 1.

0
m@rina Messages postés 20944 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 27 septembre 2024 11 329 > brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024
5 déc. 2023 à 13:27

Bonjour brucine

Pas sûre d'avoir compris tout, mais dans le remplacement le signe \ suivi du numéro fait référence aux termes de recherche entre parenthèses.

Donc dans mon exemple je n'ai qu'un seul terme entre parenthèses. Donc je remplace bêtement par un crochet ouvrant simple, le contenu \1 qui correspond au terme entre parenthèses, et un crochet fermant simple.

Je précise que pour chercher un caractère qui est un caractère générique, il suffit de le faire précéder par le signe \.

Donc \( recherche une parenthèse ouvrante.

m@rina 

2

Bonjour m@rina, 

Oui, toujours intéressée. Je crois que nous ne sommes pas dans le même fuseau horaire, d'où le décalage... ;)

Dans cet exemple, le texte commençait effectivement toujours par "para."

Comme je l'indiquais dans ma question, les chiffres ne sont pas toujours les mêmes. "para." peut être suivi d'une espace ou d'une espace insécable. 

Dans la solution, je crois comprendre que [\1] renvoie à la première paire de parenthèses. 

C'est nouveau pour moi tout ça, alors j'essaie de bien démêler la syntaxe pour pouvoir me débrouiller la prochaine fois! 

Je note la solution.
Merci de votre aide! 

0
m@rina Messages postés 20944 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 27 septembre 2024 11 329 > Nanane
5 déc. 2023 à 14:39

Bonjour Nanane,

Non, regarde ce que j'ai expliqué plus haut dans le <14>.

m@rina

0
Nanane > m@rina Messages postés 20944 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 27 septembre 2024
5 déc. 2023 à 20:18

Ah oui, je vois... le \1 renvoie à "(para*\([0-9]{1;3}\))" qu'on encadre simplement des crochets. 

Je craignais que le crochet ne soit aussi traité comme un caractère générique dans le champ Remplacer. 

Bref... j'apprends! 

0
yclik Messages postés 3673 Date d'inscription vendredi 25 juillet 2014 Statut Membre Dernière intervention 25 septembre 2024 1 503
1 déc. 2023 à 17:55

bonsoir

A tester

rechercher espace et (   c'est à dire    " (" sans les guillemets

remplacer par  " ["

rechercher "))" 

remplacer par ")]"

0

Merci pour la réponse. 
 

Comme c’est un document plutôt volumineux, j’aimerais pouvoir préciser la recherche le plus possible, plutôt que d’appliquer le remplacement occurrence par occurrence. 

0
brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024 2 399 > Nanane
1 déc. 2023 à 20:04

Bonjour,

Je n'ai pas encore trouvé (ni vraiment cherché) la syntaxe précise, mais une chose me paraît sûre, on va se faire planter par les caractères recherchés ( ) [] parce qu'ils ont eux-mêmes une signification dans la recherche générique.

Il faut donc les échapper par leurs valeurs ASCII respectives, ^040, ^041, ^092, ^093

Il est donc probable qu'on se fasse planter par la syntaxe de recherche que tu as indiquée, ou en tout cas son remplacement.

En français, il faut donc chercher quelque chose (je suppose) qui commence < par un espace et qui est suivi de ^040 et d'une lettre quelconque [a-z] suivi d'un nombre de caractères génériques quelconque * et se terminant > par ^041 répété 2 fois et remplacer à syntaxe identique ^040 par ^092 et ^041  par ^093.

Je n'ai pas trop le temps de chercher la bonne syntaxe pour le moment, je reviens si je trouve avant toi ou avant que Marina qui est la sorcière de la chose passe par là.

0
brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024 2 399 > brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024
1 déc. 2023 à 23:05

Lapsus, c'est ^091 et ^093.

Recherche en supposant qu'il y un espace avant la chaîne:

([ ][^040])(*)([^040])(*)([^041])([^041])

Les parenthèses servent à couper en autant de morceaux que je peux remplacer en les séparant dans l'ordre par \.

Je devrais donc écrire:

.^091\2\3\4\5\^093

Qui fonctionne bien pour le crochet ouvrant 091, mais pas pour le fermant en 093, tout remplacement qui n'est pas en première position plante.

Bref, si tu as en fonction l'inspiration, je continue à creuser...

0
brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024 2 399 > brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024
2 déc. 2023 à 22:24

Beau fouiller ça dans tous les sens, je ne trouve aucune syntaxe "en une passe".

Au plus simple, on fait comme yclick a suggéré, mais ça manque peut-être de sélectivité pour chercher " (".

On peut éventuellement sécuriser un peu en deux passes comme suit.

Activer les caractères génériques.
Chercher ([ ][(])(*)([(])([0-9]@)([)])([)]) qui enlève à peu près toute chance de trouver autre chose.
Remplacer par .[\2\3\4\5\6 (il y a un espace avant le crochet) qui remplace la première parenthèse entrante.

Le hic, c'est que je ne trouve aucun moyen de sécuriser la recherche pour remplacer la parenthèse fermante, devant en effet se contenter, caractères génériques désactivés, de faire une deuxième recherche )) (tout de même peu probable dans un texte "normal" par ailleurs) remplacée par )]

0
brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024 2 399 > brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024
3 déc. 2023 à 19:56

Illustrons par l'exemple, soit la chaîne  (para. 7(1)) où il y a un espace avant la parenthèse entrante, et où la chaîne et le nombre entre parenthèses sont quelconques.

La théorie se fait en une passe.

En cherchant caractères génériques
([!^040 ])(*)([(])([0-9]@)([)]) j'obtiens  para. 7(1) sans les parenthèses fermantes.

L'opérateur & échappé soit ^& me permet de rendre dans remplacer ce que j'ai recherché, en théorie, je fais donc remplacer,  [^&] (espace avant) remplacer tout, et on va se coucher.

Donc à tester, il y a peut-être un bug dans mon installation Word qui conserve les parenthèses: [(para. 7(1))]

Si c'est le cas, j'ai besoin de 2 passes supplémentaires (je pourrais écrire une syntaxe complexe pour une seule, mais bon) en désactivant les caractères génériques:

([ Remplacer par [ partout et même chose pour ]) par ] avec un meilleur niveau de sécurité tant il est improbable de trouver dans un texte les deux séquences de départ (sauf si on cause de programmation, math, chimie ou de la norme bibliographique qui veut que

([ ]) indique une précision à l'intérieur des parenthèses ou bien de toute exigence différente qu'aurait tel directeur de thèse ou de publication, mais là, on n'en sort plus...

0
votre psychiatre Messages postés 1470 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 13 juillet 2024 252
2 déc. 2023 à 23:57

si tu n'as pas énormément de chiffre différent dans ta deuxième parenthèse tu peux

rechercher (1) puis les autres

remplacer par %1#

ensuite tu remplaces toutes les ( par [ et #) par )]

puis % par (

ca fait un peu de manip mais si tu n'as pas trop d'occurrence différentes !


0
brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024 2 399
3 déc. 2023 à 08:06

Bonjour,

Le but de l'opération comme l'auteur l'a précisé est de limiter les nombre de manipulations; là on en a 3 pour chaque nombre et, s'agissant vraisemblablement de renvois de notes ou bibliographiques, on peut supposer qu'il y en a un paquet (contre 2 pour tous dans ce que j'ai proposé mais qui n'est certes pas sécurisé à 100% dans la deuxième)

La seule manière de traiter simultanément tous les nombres y compris, pourquoi pas, à plusieurs chiffres, est comme je l'ai indiqué une recherche de type ([0-9]@).

Le hic est qu'elle utilise contrairement à la tienne des caractères génériques et qu'on se fait jeter comme je l'ai rappelé en <4> par tout remplacement d'un autre morceau que  \1 et d'autant qu'il s'agit des caractères () et [] qui eux-mêmes ont une signification dans la syntaxe de rechercher-remplacer et qu'il faut donc échapper.

0
brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024 2 399 > brucine Messages postés 16934 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 27 septembre 2024
3 déc. 2023 à 08:19

J'avais pensé à une alternative par Batch, avec un peu de travail, on peut écrire exactement la structure de ce qu'il y à remplacer, mais là aussi, il y a un hic: le Batch ne lit que le format texte brut (doc) et pas le format compressé, (docx).

On peut alors passer par le portage sous Windows d'un outil Linux style PowerGrep en essai libre (ou Grep) qui sera à même d'effectuer le job en une seule passe, mais qui se heurte au fait de le télécharger/installer et d'y écrire la syntaxe idoine, ce qui outre y passer sans doute plus de temps que de faire des opération successives passe par celui d'en acquérir les compétences.

0