Identifier caractère qui suit un "_" et ledéplacer

Fermé
am33450 Messages postés 20 Date d'inscription vendredi 30 mars 2018 Statut Membre Dernière intervention 22 août 2018 - 30 mars 2018 à 16:05
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 4 avril 2018 à 17:45
Bonjour à tous !

Nouveau en Perl, je rencontre une petite difficulté. Dans un fichier texte, je voudrais faire la modification suivante :

Lorsqu'en lisant le fichier lignes par lignes je tombe sur un underscore ("_") je voudrais faire une boucle permettant d'analyser le caractère qui se situe à droite du "_". Si c'est une lettre, le déplacer sur la position où se trouvait l'underscore en laissant un espace à l'ancienne place de cette lettre. Si c'est un chiffre, simplement remplacer cet underscore par un espace.

Petit exemple, je voudrais que :
_H__1 CU_71
me donne :
H 1 CU 71

Connaissez-vous une fonction permettant d'analyser le type de caractère se trouvant à la droite d'un autre ?

Meci d'avance !
A voir également:

2 réponses

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
30 mars 2018 à 18:55
Bonjour

regarde du coté des Regex, je ne sais pas si ça s'implémente en Perl, mais c'est un outil "universel" donc je pense que oui.

Petits exemples
http://regexstorm.net/tester?p=%28_%29%2b%28%3f%3d%5bA-Za-z%5d%29&i=Supprime+tout+_+avant+une+lettre%0d%0a_H__1+CU_71+___e+_Z&r=

La Regex est
(_)+(?=[A-Za-z])
et on remplace par du vide
(voir l'onglet Context pour le résultat)

http://regexstorm.net/tester?p=%28_%29%2b%28%3f%3d%5b0-9%5d%29&i=Supprime+tout+_+avant+une+lettre%0d%0a_H__1+CU_71+___e+_Z&r=+

La regex est
(_)+(?=[0-9])
et on remplace par l'espace


1
am33450 Messages postés 20 Date d'inscription vendredi 30 mars 2018 Statut Membre Dernière intervention 22 août 2018
3 avril 2018 à 12:52
Merci Whismeril !

Ça marche bien à part pour les isotopes dont le nom ne contient qu'une seule lettre (il y a un petit décalage, il manque juste un espace en plus entre la lettre et le numéro atomique).

Pour l'instant, je copie toute la ligne quand je tombe sur une telle chaîne, sais-tu comment je pourrais récupérer seulement les chaînes ?

Merci d'avance
0
am33450 Messages postés 20 Date d'inscription vendredi 30 mars 2018 Statut Membre Dernière intervention 22 août 2018
3 avril 2018 à 13:48
Par exemple,
lorsque j'ai une ligne comme ça dans le fichier 1 :
eg CU_72 1.0045782E9
eg CU_73 1.0293612E9

J'aimerai obtenir dans un fichier 2 :
CU 72
CU 73
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
3 avril 2018 à 16:56
Je n’arrive pas à comprendre ton exemple de 13:48 par rapport à la demande de 12:52, c’est 2 cas différents?
0
am33450 Messages postés 20 Date d'inscription vendredi 30 mars 2018 Statut Membre Dernière intervention 22 août 2018
4 avril 2018 à 08:34
Non non c'était juste pour illustrer ce que j'ai expliquer à 12:52. C'est bien les mêmes cas. Mon problème est de savoir comment copier seulement une chaîne de caractère qui m’intéresse et non pas toute une ligne comme mon programme le fait pour l'instant.

Merci d'avance de tes conseils
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
4 avril 2018 à 12:08
Afin de répondre au mieux, peux tu me donner les cas que tu trouves avec les sorties attendues de façon la plus exhaustive possible?
Merci
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
4 avril 2018 à 17:45
Pour extraire les isotopes
([A-Z]{1,2})(( *)|(_*))(\d+[A-Z]?)

Exemple, voir l'onglet table
http://regexstorm.net/tester?p=%28%5bA-Z%5d%7b1%2c2%7d%29%28%28+*%29%7c%28_*%29%29%28%5cd%2b%5bA-Z%5d%3f%29&i=H+3+C+14+TH233+U239+NP236F+NP236M+AM242M+CM243+%0d%0aBK246+BK250+CF251+CF253+TL207M+FR224+CF246+CU+71+%0d%0a%0d%0a_H__3+1.0392E%2b13+0.0000E%2b00+1.0392E%2b13+%0d%0a_C_14+2.6451E%2b08+0.0000E%2b00+2.6451E%2b08+


Après, tu énumères toutes les captures.
Pour chacune, il suffit de tester la longueur de $1,
  • si c'est 1 tu exportes $1 $2
  • si c'est 2 tu exportes $1$2


0