IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Expression régulière quelconque


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut Expression régulière quelconque
    Bonjour,
    on en finira jamais avec ces regexp! Je n'ai malheureusement pas trouvé la réponse en fouillant le site.

    Voilà mon problème, j'ai envie de capturer des expressions dont j'ignore exactement comment elles s'écrivent. Elles reviennent parfois
    toujours pas à la même position, en règle générale entre parenthèses, mais pas toujours.
    La seule information qui matche partout, ces expressions (des fonctions) sont toujours composées de
    - majuscules,
    - "_" (underscore)
    - parfois à la fin un nombre

    donc du type: XX_XYY_....._ZZ_1

    Exemple: DT_PT_1

    deux exemple de ligne où je veux capturer cette fonction:

    FRAME NAME: DriveTrainData1_A Daten Antriebsstrang 1 (DT_PT_1, internal Gateway FA-CAN)
    FRAME NAME: DriveTrainData1_FA Daten Antriebsstrang 1 (DT_PT_1)

    Quelqu'un aurait-il une idée?

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Peut-être ceci:

    Ou alors, peut-être mieux:


  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    en fait je les avais déjà essayées, tes deux expressions, sans succès. c'est peut-être mieux avec mon bout de code et surtout la description complète du problème:

    1- Je voudrais parser le document par bloc (entre les délimiteurs = /FRAME NAME/../FRAME NAME/)
    2- au passage capturer le nom de la trame figurant dans la ligne avec entête "FRAME NAME.
    * le nom n'est pas connu d'avance
    * il n'est pas souvent à la même position
    * il est très souvent entre parenthèse (j'en ai vu entre crochets, voir le bloc 2 de l'exemple du fichier *.txt joint)
    * il n'est formé que de majuscules, underscores ("_"), parfois un nombre à la fin

    l'analyse du doc entre les délimiteurs je pourrais le faire. Le plus important est de délimiter et capturer les noms.
    dans le doc word j'ai mis en rouge des exemples de noms à relever.

    voici le début de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    use warnings;
    use constant SCRIPT_NAME => "Patch Mapping_CAN_FR.pl";
    use constant SCRIPT_VERSION => "1.0";
     
    my $ScrDIR = $ARGV[0]; 
    my $out_dir = $ARGV[1];
    my $flag = 0;
    my $frame = '';
    my $line;
    my @array;
    my $Count = 0;
     
    #Log_Info("USAGE: " . SCRIPT_NAME." <Source Folder> [<Output folder> optional]" );
     
    #------------Open source file------------	
    my $ScrFile = $ScrDIR."\\test.txt"; #Source document: Frame report list
    my $fhR; 
    open ($fhR, $ScrFile) or die "Unable to open the file $ScrFile\n"; 
    #----------------------------------------
     
    #-------------write file-----------------
    #my $fhWrite = $out_dir."\\patch_mapping-A-FA_CAN".".txt";# Created document: mapping INCA Signal name - Internal signal name
    #open ($out_dir, '>', $fhWrite) or die "Unable to open the file $fhWrite\n";
    #----------------------------------------
     
    while ($line = <$fhR>) #As long as the file fhR contains data, we read the data
    {
     
    	if ($line =~/FRAME NAME:/)
    	{
    		$Count ++;
    		#if ($line =~ /FRAME NAME/ )
    		#{
    			#my $regexp = qr
    				#{
    					#FRAME NAME:\s+.*?([^']\w+)
    				#}x;
    			#$frame = $line =~ $regexp;
    			$frame = $line =~ /(([A-Z]+_)+\d?)/;
     
    		#}
    	 print"my Frame: $frame\n";
     
    	}
     
    }
    print "number of frames = $Count\n";  # combien de fois il retrouve "FRAME NAME" dans le doc
    <>;
    Fichiers attachés Fichiers attachés

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Par défaut
    je m'essaye à une proposition en repartant de ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while (<$fhR>) #As long as the file fhR contains data, we read the data
    {
     
            if ($_ =~/FRAME NAME:.*[\(|\[]([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]]/)
            {
     
                    print"my Frame: $1\n";
     
            }
            else
            {
                    # Traitement de tes autres lignes
            }
    }
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -bash-3.00$ perl test.pl
    my Frame: DT_PT_1
    my Frame: DIAG_OBD_ENG
    my Frame: BN_UVL
    my Frame: ST_COSP_FU_ENG
    my Frame: TORQ_CRSH_3
    my Frame: WMOM_DRV_1
    ça me semble correcte en travaillant avec ton fichier txt

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    Bonjour 6ril23 et merci pour ta Regexp,

    j'ai actualisé le fichier texte en pièce jointe. Dans le dernier bloc il y a la fonction DT_PT_1 qui revient
    et j'aimerais la choper aussi. Donc dans le résultat on devrait la voir 2 fois. comment étendre la Regexp?

    la deuxième question c'est, si je travaille par bloc avec délimiteurs, alors je ne peux plus extraire les fonctions (vu qu'elle
    sont contenues dans les lignes portant les délimiteurs.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while ($line = <$fhR>)
    {
        if (/FRAME NAME/../FRAME NAME/)
       {
          intructions...
       }
    }
    comment devrait-on s'y prendre au mieux?
    Fichiers attachés Fichiers attachés

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Par défaut
    ben pour la première question c'est résolu.
    j'ai rajouté une virgule à la fin dans le match "|\," .

    avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($line =~/FRAME NAME:.*[\(|\[]([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]]/)
    après:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($line =~/FRAME NAME:.*[\(|\[]([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]|\,]/)
    reste la deuxième question!


  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Par défaut
    Citation Envoyé par lauvydream Voir le message
    Bonjour 6ril23 et merci pour ta Regexp,

    j'ai actualisé le fichier texte en pièce jointe. Dans le dernier bloc il y a la fonction DT_PT_1 qui revient
    et j'aimerais la choper aussi. Donc dans le résultat on devrait la voir 2 fois. comment étendre la Regexp?
    Non c'est normal de ne pas la voir la seconde fois car je recherche les motifs (Fonction) et [Fonction], or dans ce cas le motif est (Fonction, ...)
    La seule modification que je pense être possible de ne pas mettre le "[\)|\]]" à la fin de la regex MAIS attention, plus tu seras laxiste dans ta regex, plus tu ramèneras des résultats souhaités mais aussi non souhaités

    Citation Envoyé par lauvydream Voir le message
    la deuxième question c'est, si je travaille par bloc avec délimiteurs, alors je ne peux plus extraire les fonctions (vu qu'elle
    sont contenues dans les lignes portant les délimiteurs.)
    effectivement si tu travailles par bloc tu perds le "tag" 'FRAME NAME' et tu risques de galérer car le modèle AAA_BBB_X n'est pas spécifique de ta fonction


    Citation Envoyé par lauvydream Voir le message
    comment devrait-on s'y prendre au mieux?
    Y a-t-il un impératif à ce que tu travailles par bloc?
    Personnellement je trouve beaucoup mieux de faire lire ton fichiers ligne par ligne et de les traiter en même temps quand c'est possible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    open($fhR, $fichier_name);
    while (<$fhR>)
    {
            if ($_ =~/FRAME NAME:.*[\(|\[]([A-Z]+_[A-Z]+(?:[_ A-Z 0-9]+)?)[\)|\]]/)
            {
                    print"my Frame: $1\n";
            }
            elsif ($_ =~/regex2/)
            {
                    print "mon info: $1 $2 $3...\n";
            }
            elsif ($_ =~/regex3/)
            {
            }...
            else
            {
                    # Traitement de tes autres lignes
            }
    }
    Quand je parle de traitement ça peut être une écriture direct dans ton fichier de sortie, mais ça peut également utiliser des Tableaux de hash pour stocker tes infos: attention dans ce cas aux clés en doublons dans le fichier afin de ne pas écraser tes données


    [Edit] Oui avec la virgule ça doit fonctionner très bien aussi, j'y avais pas pensé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/07/2012, 17h37
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo