Aide pour une regex

teissierb Messages postés 2 Date d'inscription vendredi 22 décembre 2023 Statut Membre Dernière intervention 22 décembre 2023 - 22 déc. 2023 à 12:40
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 22 déc. 2023 à 19:14

Bonjour

J'ai besoin de "purifier" des phrases pour pouvoir les utiliser dans une application.
Merci beaucoup pour votre aide à construire le bon code :)

Je pense que le pattern est le suivant :

- 'n'importe quelle phrase' (0 ou 1 fois) {texte ici} (0-N fois)

exemple
AB CD {xxxxx}
ou AB CD {xxxxx,yyyy}
ou {xxxxx}
ou AB CD
ou AB CD {xxxxx} AB CD {xxxxx}
ou AB CD {xxxxx} {xxxxx} {xxxxx}
etc


- le bloc {texte ici} ressemble à {chiffre|du texte}.
Par exemple, le bloc {texte ici} ressemble à {chiffre|du texte} :
{1|xxxxxxxxx}

- le bloc "texte" peut (mais ce n'est pas obligatoire) contenir "default=xxx" à n'importe quel endroit du texte

ex : {3|abc=d,default=ma valeur} ou {2|a b c=d,default=ma valeur,another=valueThatIDontNeed} ou {1|default=ma valeur}

J'ai besoin d'isoler les parties suivantes et de les renvoyer dans une chaîne.
- le texte 'n'importe quelle phrase' (s'il existe)
- xxx du motif "default=xxx", conformément à l'explication ci-dessus.

Il n'est pas nécessaire de le faire en une seule fois, je peux le scripter dans des boucles en Python par exemple.

Voici quelques exemples

Exemple 1
Store bulk masses greater than {0|message=<specify mass="" value="">|filter=^(_)?MASS_VALUE.+|add space after=false.+}{1|message=<specify mass="" unit="">|filter=^(_)?P413_MASS_UNIT.+} at temperatures not exceeding {2|message=<specify temperature="" value="">|filter=^(_)?TEMP_VALUE_.+|add space after=false.+}{3|message=<specify temperature="" unit="">|filter=^(_)?P413_TEMP_UNIT_.+}

devrait donner:
Store bulk masses greater than at temperatures not exceeding

Exemple 2
Inhoud onder {0|message=<geschikt(e) vloeistof="" of="" gas="" specificeren="">|default=inert gas|filter=^(_)?P231_STORAGE_.+} gebruiken en bewaren. Tegen vocht beschermen.

Devait donner:

Inhoud onder inert gas gebruiken en bewaren. Tegen vocht beschermen.

Exemple 3
EN CAS DE CONTACT AVEC LA PEAU: Laver abondamment{0|message=<préciser un="" produit="" de="" nettoyage="">|default=à l’eau|filter=^(_)?P352_WASH_.+}. Appeler immédiatement {1|message=<préciser qui="" pourra="" émettre="" comme="" il="" convient="" n="" avis="" médical="" en="" cas="" d’urgence="">|default=un CENTRE ANTIPOISON ou un médecin|filter=^(_)?P310_EMERGENCY_.+}.

Devrait donner:
EN CAS DE CONTACT AVEC LA PEAU: Laver abondamment à l’eau . Appeler immédiatement un CENTRE ANTIPOISON ou un médecin

Exemple 4

{0|message=<specificeren of="" dumpingvoorschriften="" van="" toepassing="" zijn="" op="" inhoud,="" container="">|default=Inhoud/verpakking|filter=^(_)?P501_REQUIREMENT_.+} afvoeren naar {1|message=<specificeer welke="" lokale="" regionale="" nationale="" internationale="" wetgeving="">|default=…|filter=^(_)?P501_DISPOSAL_.+}.

Devrait donner
Inhoud/verpakking afvoeren naar … .
 

2 réponses

teissierb Messages postés 2 Date d'inscription vendredi 22 décembre 2023 Statut Membre Dernière intervention 22 décembre 2023
22 déc. 2023 à 12:43

Je voulais faire une boucle python pour isoler les 2 principaux types de blocs puis pour chaque bloque, s'il s'agit du bloc {xxx} isoler avec une autre regex le default=xxx

https://regexr.com/

regex: /((?![{}])\w| )*|(({.*?}))/g

Ca fonctionne à l'écran, mais pas sous python, le match n'est pas du tout le même 

Une idée ?

0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
22 déc. 2023 à 19:14

Bonsoir

et si tu essayais de faire l'inverse, c'est-à-dire d'utiliser un replace regex, pour enlever tout ce qui est entre accolades.

Un exemple sur regex101 en choisissant le moteur Pyhton.

https://regex101.com/r/DZ8o2D/1

Le pattern de recherche 

\{.*?\} ?

Et chaine vide en replacement. 


0
Rejoignez-nous