Regex Rechercher et remplacer des séries de chiffres identiques contigus par paquets

Discussions à propos du traitement de textes Writer mais également sur l'éditeur HTML.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Regex Rechercher et remplacer des séries de chiffres identiques contigus par paquets

Message par touvenant »

Bonjour,
voici un petit problème de type scolaire (mais sans la solution !) :
Supposons qu'un texte comporte des séries de chiffres identiques contigus.
Certaines séries sont composées d'un nombre de chiffres identiques contigus multiple de 2,
D'autres séries sont composées d'un nombre de chiffre identiques contigus multiple de 3.
On souhaite remplacer, dans les séries multiple de 2, chaque paquet de 2 chiffres par le chiffre 2,
et dans les séries multiple de 3, chaque paquet de 3 chiffres par le chiffre 3 ?

Exemple :
0010111010111101000000101011010010110111
donc
00 10 111 010 11 11 01 000 000 1010 11 01 00 10 11 0 111
devient
2 10 3 010 2 2 01 3 3 1010 2 01 2 10 2 0 3
donc
21030102201331010201210203

Précision :
Dans l'exemple, 000000 peut être interprété comme 00 00 00, soit 222 ou comme 000 000, soit 33.
Lorsque ce genre de confusion est possible, c'est le résultat contenant le plus grand chiffre (donc 33) et non pas celui représentant le plus grand nombre (222) qui doit être retenu

Question :
Est-ce que les regex permettent une telle chose ?
Dernière modification par touvenant le 14 oct. 2024 08:14, modifié 1 fois.
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9957
Inscription : 28 août 2010 08:45

Re: rechercher et remplacer des séries de chiffres identiques contigus par paquets

Message par micmac »

Bonjour,

Dans cette section, la balise [Writer] n'a pas lieu de figurer dans le titre. Les balises sont réservées à la section Macros et API. Veuillez corriger.

Avant de poster une nouvelle question, il nous serait agréable que vous donniez suite au fil précédemment ouvert :
[Writer]Recherche et remplace sur les sélections
notamment en précisant la solution retenue et en ajoutant le balisage [Résolu] Image si c'est le cas.
C'est une question de courtoisie pour les gens qui vous ont répondu et consacré bénévolement de leur temps. Notre forum est plus lisible avec ce balisage comme vous avez pu vous en rendre compte en le parcourant.

Merci de votre collaboration
Touche Ctrl de Windows = touche cmd⌘ sur Mac
OpenOffice > Outils > Options sur Windows = OpenOffice > Préférences sur macOS
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: [Writer] rechercher et remplacer des séries de chiffres identiques contigus par paquets

Message par touvenant »

Bonjour Micmac,
sur le fil [Writer]Recherche et remplace sur les sélections,
la question est toujours en suspens... Je ne sais toujours pas s'il est possible d'effectuer une opération de recherche et remplacement sur des sélections.
C'est la raison pour laquelle je n'ai pas résolu le fil. (D'autant plus qu'à la lecture de l'ouvrage de M. Pytoniak, il me semble avoir trouvé une piste, mais que je n'ai pas encore explorée...)
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 6077
Inscription : 02 janv. 2009 23:56

Re: Regex Rechercher et remplacer des séries de chiffres identiques contigus par paquets

Message par Jean-Louis Cadeillan »

Bonjour,
Si tu mets ton texte initial dans la cellule A1 d'une feuille Calc, il est possible de trouver la solution. Dans le fichier joint, j'ai mis les différentes étapes de résolution pour mieux comprendre la démarche algorithmique. Il y a un commentaire dans chaque entête de colonnes (C à F) ou chaque cellule (A1, A3, A4). Le nombre de caractères de la chaîne initiale dans A1 n'est pas un problème (2^28-1 en théorie) : il sera limité par le nombre de lignes (2^20)… et surtout par la mémoire disponible !
Cordialement,
Jean-Louis
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Windows 10 Pro 64, LibO 25.2.7.2 (JRE 1.8.0_471) et AOO 4.1.16 (Adoptium 19.0.2.7)
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: Regex Rechercher et remplacer des séries de chiffres identiques contigus par paquets

Message par touvenant »

Bonsoir Jean-Louis,
je te remercie pour ta réponse.
Ta solution fonctionne à merveille, cependant, la question portait sur une résolution dans Writer et avec des regex.
Il est bien sûr envisageable de coder une macro qui couperait le texte sélectionné dans writer, qui ouvrirait un document calc, qui collerait le texte dans la première cellule puis qui copierait tes formules sur autant de ligne que de caractères dans le texte, puis qui récupèrerait le contenu de la cellule A4 et le collerait dans writer...
Mais y-a-t-il une regex qui ferait le job sans passer par toute cette gymnastique ?
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 6077
Inscription : 02 janv. 2009 23:56

Re: Regex Rechercher et remplacer des séries de chiffres identiques contigus par paquets

Message par Jean-Louis Cadeillan »

Bonsoir,
J'ai l'impression qu'il me manque quelques précisions :
touvenant a écrit : 14 oct. 2024 02:08 un texte comporte des séries de chiffres identiques contigus.
  • le texte comporte-t-il autre chose (d'autres caractères, des phrases de texte, des espaces, etc.) que des chiffres ?
  • le texte comporte-il autre chose (d'autres chiffres) que des 1 ou des 0 ?
  • pour les n-uplets (paquets) de 1 ou 0, n est-il quelconque (n'importe quelle valeur) ?
  • le texte comporte-t-il plusieurs listes de 1 ou 0 séparées (avec pour chacune une série de n-uplets) ?
  • si la série comporte un n-uplet dont n n'est pas divisible ni par 3 ni pas 2 (par exemple 11111), doit-on considérer qu'il s'agit de la juxtaposition, par exemple, d'un doublet et d'un triplet (ce cas n'est pas traité dans les formules que j'ai proposées…) ?
touvenant a écrit : 14 oct. 2024 02:08 On souhaite remplacer
  • s'agit-il de remplacer la chaîne initiale (et donc qu'elle n'apparaissent plus) par la nouvelle, ou bien faire l'opération en maintenant la chaîne initiale et la chaîne nouvelle ?
  • s'agit-t-il de traiter un document texte déjà rédigé avec des listes en plusieurs endroits (séparées par des textes en français, par exemple) et des les transformer toutes en même temps ?
N'ayant pas ces réponses à ce stade, je ne comprends pas bien la finalité d'une approche avec Writer.
D'un autre côté, rien n'empêche d'incorporer un classeur dans un document Writer autant de fois qu'on le désire.
Le document joint odt utilise une formule unique matricielle (en A2) pour faire la transformation (voir le document ods pour plus d'explications). Cette formule utilise l'extension Lox365 pour avoir la fonction TEXTSPLIT() à disposition (elle n'est toujours pas présente nativement dans la version 24.8 ), mais j'aurais très bien pu utiliser les formules et colonnes de mon précédent post dans les classeurs Calc incorporés. Autre remarque : dans le classeur incorporé, on peut ne faire apparaître que le résultat final, la chaîne initiale étant cachée.
touvenant a écrit : 15 oct. 2024 17:00 y-a-t-il une regex qui ferait le job
Je ne vois pas, essentiellement du fait de la recherche des multiples : tous les n-uplets multiples de 2 et 3 à la fois seraient à traiter individuellement et donc traiter 000000, 111111, 000000000000, etc. Mais peut-être fais-je une erreur d'analyse.
Reste la piste du traitement par macro (en utilisant ou non la démarche algorithmique de la première ou la seconde formule), mais cela dépasse mes compétences. Si tu comptes explorer cette voie, il faudra poster un message dans la rubrique Macros et API du Forum.
Cordialement,
Jean-Louis
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Windows 10 Pro 64, LibO 25.2.7.2 (JRE 1.8.0_471) et AOO 4.1.16 (Adoptium 19.0.2.7)
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 92
Inscription : 23 déc. 2012 18:42

Re: Regex Rechercher et remplacer des séries de chiffres identiques contigus par paquets

Message par touvenant »

Bonjour Jean Louis,
ne te tortures pas trop stp, ta première réponse était parfaite en terme de compréhension du problème, à l'exception de travailler sur Writer avec des regex.
le texte comporte-t-il autre chose (d'autres caractères, des phrases de texte, des espaces, etc.) que des chiffres ?
non
le texte comporte-il autre chose (d'autres chiffres) que des 1 ou des 0 ?
non
pour les n-uplets (paquets) de 1 ou 0, n est-il quelconque (n'importe quelle valeur) ?
oui
le texte comporte-t-il plusieurs listes de 1 ou 0 séparées (avec pour chacune une série de n-uplets) ?
non
s'agit-il de remplacer la chaîne initiale (et donc qu'elle n'apparaissent plus) par la nouvelle
oui
s'agit-t-il de traiter un document texte déjà rédigé avec des listes en plusieurs endroits (séparées par des textes en français, par exemple) et des les transformer toutes en même temps ?
non
si la série comporte un n-uplet dont n n'est pas divisible ni par 3 ni pas 2 (par exemple 11111), doit-on considérer qu'il s'agit de la juxtaposition, par exemple, d'un doublet et d'un triplet (ce cas n'est pas traité dans les formules que j'ai proposées…) ?
je n'ai effectivement pas apporté cette précision : ce n'est ni un doublet, ni un triplet, donc laisser telquel est une bonne réponse, mais traiter 55555 = 5 est une bonne réponse également.
Je ne vois pas, essentiellement du fait de la recherche des multiples : tous les n-uplets multiples de 2 et 3 à la fois seraient à traiter individuellement et donc traiter 000000, 111111, 000000000000, etc. Mais peut-être fais-je une erreur d'analyse.
Je ne sais pas répondre à cette question, comme je l'ai précisé, je ne donne pas la solution du problème... parce que je ne l'ai pas.
Il convient d'appréhender ce problème comme un exercice permettant une meilleure compréhension des regex.
l'expression (00)*, par exemple, va capturer chacun des groupes de 00 qui se succèdent, mais le remplacement ne se fera pas sur chaque groupe mais sur l'ensemble, malgré que la parenthèse soit fermée avant le quantifieur... comment contourner ce fonctionnement ? (sans contourner le problème !)

Si nécessaire, rien n'empêche d'effectuer plusieurs recherche et remplace consécutif, avec des cibles regex (ou pas) identiques (ou pas)...
LibreOffice 24.2.7.2 x64
Windows10 Pro v10.0.19044