Une regex pour une énigme

Résolu/Fermé
FoNeTiK Messages postés 11 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 14 juillet 2018 - 13 juil. 2018 à 13:38
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 - 14 juil. 2018 à 08:47
Bonjour,

Dans le cadre d'une chasse au trésor, j'ai à résoudre une énigme qui me donne du fil à retordre.
Il s'agit, grosso modo, de remettre dans l'ordre des groupes de lettres pour former une ou plusieurs phrases.
Après avoir usé des heures de réflexion dessus, j'ai pensé qu'un outil informatique qui pourrait me proposer tous les mots possibles avec ces motifs de lettres pourrait grandement m'aider à parvenir à mes fins.
J'ai donc naturellement foncé vers le site dcode.fr en pensant y trouver mon bonheur. Malheureusement, je n'ai pas trouvé l'outil adéquat. Le solveur de "Mots Couplés" s'en approche mais il s'obstine à ne former que des mots de 2x3 lettres. Or ma phrase à déchiffrer peut très bien contenir des mots de 3 ou 10 lettres.
Après les avoir directement contactés, ils m'ont conseillé d'utiliser leur outil de recherche de mots par expression régulière. Le problème : c'était la première fois que j'entendais parler de ce langage.
Si j'ai bien compris, je pourrais demander à la machine de rechercher dans sa base de données (les dictionnaires de dcode.fr) tous les mots correspondants aux critères énoncés dans une regex.
Pensez-vous que ce serait possible à faire ?
Si oui, de quelle manière devrait être formulée ma regex ?
Pour être sûr que tout le monde comprenne bien ce que je cherche à faire, je vais donner un exemple :
J'ai à ma disposition les motifs suivants : PO TS IM SAN DES
Je souhaiterait que la machine les assemble afin de former tous les mots possibles. Cela donnerait :
IMPOSANTS, IMPOTS, POTS, DES
(trouver tous les mots possibles, longs comme courts)
N'hésitez pas à me questionner si je n'ai pas été assez clair et je suis prêt à faire le gros de l'effort, si vous avez juste des liens vers des tutos pour apprendre les regex (appliquées à ce que je cherche à faire bien sûr), je suis preneur.


2 réponses

Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
13 juil. 2018 à 14:20
Bonjour
De tutos sur les regex, il y en a des tonnes.
Si tu codes habituellement en php, par exemple, tu tappes « regex php tuto » et tu vas trouver ton bonheur.

Maintenant, ça n’est pas un outil de combinaison, c’est un outil de recherche et d’extraction.
Il faut donc lui fournir un texte, un liste de mots, bref de l’ascii en source et ça va te sélectionner toutes les occurrences qui correspondent à ta « requête ».

Je peux te faire un exemple avec tes critères, mais un peu plus tard dans l’après-midi.
0
FoNeTiK Messages postés 11 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 14 juillet 2018
13 juil. 2018 à 14:50
Le truc c'est que, justement, les tutos que je trouve ne me donnent pas satisfaction. Par exemple, j'aimerais pouvoir exprimer "et/ou" un peu comme avec les opérateurs logiques mais je ne trouve pas d'équivalence...
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
Modifié le 13 juil. 2018 à 15:05
Y a de et, par defaut tout est et.
abc
c’est a et b et c.

Pour le ou, ça depend, pour un caractère ça peut être
[abc]
ou
a|b|c
, pour plusieurs caractères c’est
(ab)|(cd)


Dès que je rentre et que j’ai accès à mon pc, je te montre.
0
FoNeTiK Messages postés 11 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 14 juillet 2018
13 juil. 2018 à 15:46
J'ai un début de quelque chose : ^(PO|TS|IM|SAN|DES)+$
Ça me donne presque ce que je veux. Le seul problème c'est que je me retrouve avec des mots comme POPO ou SANSAN (wtf ?). J'aimerais éviter la répétition d'un même motif. Si je mets une seule fois PO, j'aimerais qu'il n'apparaisse qu'une fois au maximum.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
Modifié le 13 juil. 2018 à 17:40
^ et $ t'obligent à chercher sur une chaine entière, c'est peut-être ce qui t'arrange.
Mais si par exemple tu charges un fichier de mots, il est peut-être plus judicieux d'utiliser \b (limite de mots).
Un exemple à cette adresse:
http://regexstorm.net/tester?p=%5cb%28PO%7cTS%7cIM%7cSAN%7cDES%29%2b%5cb&i=IMPOSANTS%2c+IMPOTS%2c+POTS%2c+DES%2c+ETUDES%2c+DESPOTS.+POPO+SANSAN


Pour la non-répétition ça se complique. Je vais y réfléchir.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
13 juil. 2018 à 17:57
J'ai p'tet un début de piste, mais ça va être compliqué pour le faire entier

Là ça ne cherche que les mots de 2 motifs, qui commencent par PO ou DES
http://regexstorm.net/tester?p=%5cb%28%3f%28PO%29%28PO%7cPOTS%7cPOIM%7cPOSAN%7cPODES%29%7c%28%3f%28DES%29%28DES%7cDESPO%7cDESTS%7cDESIM%7cDESSAN%29%29%29%5cb&i=IMPOSANTS%2c+IMPOTS%2c+POTS%2c+DES%2c+ETUDES%2c+DESPOTS.+POPO+SANSAN%2c+PODES%2c+DESPO
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
13 juil. 2018 à 23:30
Je crois que j'ai trouvé

^(?!.*PO.*PO)(?!.*TS.*TS)(?!.*SAN.*SAN)(?!.*DES.*DES)(PO|TS|IM|SAN|DES)+$


La fin tu la reconnais.
Au début, il y a un bloc qui va vérifier que chaque motif n'est pas répété.
(?!pattern)
signifie que la capture s'arrête si le pattern est vérifié plus loin dans le texte
.*PO.*PO
signifie n'importe quoi de longueur de 0 à n et PO et n'importe quoi de longueur de 0 à n et PO, donc PO répété et placé n'importe où dans le texte.
Donc si PO est présent 2 fois, la capture s'arrête, idem pour TS, SAN etc..

Seul bémol, ça ne marche que sur un texte complet, il faut donc lui faire tester les mots un par un et non un fichier d'un coup.
Cela peut s'avérer plus long à l'exécution.
http://regexstorm.net/tester?p=%5e%28%3f!.*PO.*PO%29%28%3f!.*TS.*TS%29%28%3f!.*SAN.*SAN%29%28%3f!.*DES.*DES%29%28PO%7cTS%7cIM%7cSAN%7cDES%29%2b%24&i=SANSAN


Pour gagner un rapidité, tu peux peut-être le faire en 2 fois
\b(PO|TS|IM|SAN|DES)+\b
sur tout le fichier
et
^(?!.*PO.*PO)(?!.*TS.*TS)(?!.*SAN.*SAN)(?!.*DES.*DES)(PO|TS|IM|SAN|DES)+$
sur les résultats de la première Regex
0
FoNeTiK Messages postés 11 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 14 juillet 2018
14 juil. 2018 à 00:07
Ah oui pas bête ! Merci beaucoup pour ce long code qui a dû te prendre du temps.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
14 juil. 2018 à 08:47
De rien.
Je n’y ai pas passé ma soirée, je faisais autre chose quand ça m’est venu.
0