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

MATLAB Discussion :

[regexp] Condition sur un string


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [regexp] Condition sur un string
    Bonjour,

    Je quéris votre aide face au problème que je rencontre

    Je vous expose le probleme.
    Je récupère d'un fichier un string comportant des coordonnées,
    seulement cette string peut avoir 3 ou 4 coordonnées, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String3 = '41.0000000000\136.0000000000\194.0000000000';
    string4 = '41.0000000000\136.0000000000\194.0000000000\240.0000000000';
    Ainsi, l'idée est de récupérer les 3 premières coordonnés et la 4e si elle existe. J'ai donc besoin de vous pour construire l'expression regex.
    Mon code est donc le suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    _x= '(?<_x>\d+(.)\d+)'; 
    _y= '(?<_y>\d+(.)\d+)'; 
    _z = '(?<_z>\d+(.)\d+)';
    _r= '(?<_r>\d+(.)\d+)';
     
    expression = [_x '(\\)' _y '(\\)' _z ' (?\\)(?(1)' _r ')?];
     
    data = regexp(string4,expression,'names');
     
    x = str2double(data._x);
    y = str2double(data._y);
    z = str2double(data._z);
    r = str2double(data._r);
    est ce qu'il faudrait pas le faire en deux fois avec l'option 'match' ?
    J'ai essayé pas mal de chose comme vous pouvez vous en doutez mais en vain.

    Merci d'avance pour l'aide que vous pourriez m'apporter

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    J'avoue ne pas être du tout habituée à l'utilisation de REGEXP, je préfère TEXTSCAN.

    Dans ton cas cela pourrait être suffisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str=textscan(String,'%d','delimiter','\\')
    res=str{1}
    fonctionne aussi bien pour 3 ou 4 ou n'importe quel nombre d'éléments.
    Tes nombres sont alors dans res(i), avec i allant de 1 au nombre d'éléments.

  3. #3
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Je pense que même avec REGEXP tu te compliques un peu la vie, je ferais plutot quelquechose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data = regexp(str, '[0-9\.]+', 'match');
    Et là normalement data devrait être un tableau de cellules avec 3 ou 4 cellules selon ton contenu.

    Cela dit la solution de Caro est sans doute plus simple

    Bonne apm,
    Duf

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    lol, en effet y a bien plus simple.

    merci beaucoup en tout cas. Je ne connaissais pas le textscan, je me doutais bien qu'il devait un truc comme ca sous matlab.

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Citation Envoyé par Caro-Line Voir le message
    je préfère TEXTSCAN.
    Ou simplement les fonctions de bas niveau ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String3 = '41.0000000000\136.0000000000\194.0000000000';
    String4 = '41.0000000000\136.0000000000\194.0000000000\240.0000000000';
     
    N3 = sscanf(String3,'%f%*c')
    N4 = sscanf(String4,'%f%*c')

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    coucou
    j'ai fait un test de rapidité pour voir laquelle des 3 méthodes est la plus performantes.

    Je vous laisse voir par vous même.

    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
    string4 = '42.000\865.123543\1234.00000000\12345.13245';
     
    disp('Methode sscanf');
    for i=1:10000
    tic;
    A = sscanf(string4, '%f%*c' );
    end
    toc/10000
     
    disp('Methode Regex');
    for i=1:10000
    tic;
    B = regexp(string4, '[0-9\.]+', 'match');
    end
    toc/10000
     
    disp('Methode textscan');
    for i=1:10000
    tic;
    C = textscan(string4,'%d','delimiter','\\');
    res=C{1};
    end
    toc/10000
    answer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Methode sscanf
    ans =
       1.0110e-07
     
    Methode Regex
    ans =
       1.6100e-07
     
    Methode textscan
    ans =
       7.6000e-08

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Il faut sortir les TIC des boucles FOR-END :

    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
    string4 = '42.000\865.123543\1234.00000000\12345.13245';
     
    disp('Methode sscanf');
     
    tic;
    for i=1:10000
    A = sscanf(string4, '%f%*c' );
    end
    toc/10000
     
    clear all
    string4 = '42.000\865.123543\1234.00000000\12345.13245';
     
    disp('Methode Regex');
    tic
    for i=1:10000
    B = regexp(string4, '[0-9\.]+', 'match');
    end
    toc/10000
     
    clear all
    string4 = '42.000\865.123543\1234.00000000\12345.13245';
     
    disp('Methode textscan');
    tic
    for i=1:10000
    C = textscan(string4,'%d','delimiter','\\');
    res=C{1};
    end
    toc/10000
    Résultats sur ma machine :

    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
    Methode sscanf
     
    ans =
     
       1.8323e-05
     
    Methode Regex
     
    ans =
     
       2.7315e-05
     
    Methode textscan
     
    ans =
     
       2.8370e-05

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    wouha en effet ca change. Les méthodes sont donc vraiment similaire au final.
    Merci encore pour ces infos.

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

Discussions similaires

  1. [2.0] comportement étrange sur condition sur string.indexOf
    Par franculo_caoulene dans le forum VB.NET
    Réponses: 26
    Dernier message: 18/06/2008, 12h09
  2. [XSLT][ACCESS]condition sur valeur
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 23
    Dernier message: 10/01/2005, 14h14
  3. [débutant]travailler sur contenu string
    Par Serge76 dans le forum SL & STL
    Réponses: 13
    Dernier message: 06/11/2004, 16h43
  4. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25
  5. Condition sur debug et release
    Par xave dans le forum MFC
    Réponses: 3
    Dernier message: 04/02/2004, 15h04

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