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

Python Discussion :

Remplacer des éléments dans une expression régulière


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Par défaut Remplacer des éléments dans une expression régulière
    Bonjour,

    Désolée par avance si la question a déjà été posée, je n'ai pas trouvé d'éléments pour résoudre mon problème.

    Je cherche à remplacer des éléments d'une expression régulière par des valeurs déterminées.
    Pour expliquer la démarche, je vais partir d'un exemple.
    J'ai la chaîne de caractères suivante (en pratique, elle est beaucoup plus compliquée, je fais exprès de mettre des valeurs identiques à certains endroits) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_string = "toto_toto_tata_temperature_mensuelle_20210523-20250526.nc"
    J'ai également une expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_regexp = re.compile(r"(?P<une_chaine>[^_]+)_(?P<une_autre_chaine>.*)_(?P<une_variable>[^_]+)_(?P<une_frequence>[^_]+)_(?P<une_periode>\d{4}\d*[-_]+\d{4}\d*)")
    Avec re, je récupère les valeurs des différents groupes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    regexp_match = test_regexp.match(test_string)
    if regexp_match is not None:
        my_groups = regexp_match.groupdict()
        for elt in [elt for elt in my_groups if "period" in elt.lower()]:
            del my_groups[elt]
    Je voudrais maintenant créer un template à partir de cette chaîne de caractère (pour pouvoir interpoler un nouveau nom de fichier en remplaçant juste la période).
    Pour cela, je voudrais remplacer dans le pattern de l'expression régulière tous les groupes qui ne sont pas liés à une période pour obtenir quelque chose comme cela (en partant de my_groups) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_template = "toto_toto_tata_temperature_mensuelle_(?P<une_periode>\d{4}\d*[-_]+\d{4}\d*).nc"
    Plusieurs groupes pourraient être concernés par ces exclusions pour le remplacement (pas seulement la période).

    Je n'ai pas trouvé de fonctions/méthode dans re qui permettent ce remplacement (et je voudrais éviter de partir de la chaîne de caractères dans laquelle on pourrait imaginer avoir plusieurs fois une même chaine représentant une date sans avoir à toutes les remplacer).

    Merci par avance pour vos retours sur ce qu'il serait possible de faire,
    GaelleRig

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    J'ai l'impression que vous cherchez un truc tout fait prêt à l'emploi alors qu'il suffirait de le coder (j'ai peut-être regardé ça en diagonale mais ça ne me paraît pas irréalisable).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 214
    Par défaut
    Hello,
    houla tout cela me paraît bien compliqué et en plus dans ton code il y a une erreur car tu fais une itération en changeant le dictionnaire de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     for elt in my_groups:
        if "period" in elt.lower():
            del my_groups[elt]
    RuntimeError: dictionary changed size during iteration
    Dis nous ce que tu veux faire exactement avec des exemples : chaîne(s) de départ --> résultat(s) escomptés parce que tu n'utilises peut-être pas la meilleure méthode pour arriver à tes fins. C'est parfois aussi plus simple de ne pas utiiiser des groupes nommés : les groupes sont alors repérés dans l'ordre de lecture $1, $2 etc ...

    Ami calmant, J.P

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par GaelleRig Voir le message
    J'ai la chaîne de caractères suivante (en pratique, elle est beaucoup plus compliquée, je fais exprès de mettre des valeurs identiques à certains endroits) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_string = "toto_toto_tata_temperature_mensuelle_20210523-20250526.nc"
    ...
    Je voudrais maintenant créer un template à partir de cette chaîne de caractère (pour pouvoir interpoler un nouveau nom de fichier en remplaçant juste la période).
    Pour cela, je voudrais remplacer dans le pattern de l'expression régulière tous les groupes qui ne sont pas liés à une période pour obtenir quelque chose comme cela (en partant de my_groups) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_template = "toto_toto_tata_temperature_mensuelle_(?P<une_periode>\d{4}\d*[-_]+\d{4}\d*).nc"
    Comme jurassic pork, ça m'a l'air compliqué (incompréhensible?).
    La test_string est présumée être une chaine d'informations (lue depuis un fichier, une bdd, etc). Les regex permettent de chercher dans cette chaine des informations "ressemblant à". Là donc on indique cette ressemblance par le biais d'une grammaire.
    Mais ensuite la chaine de data devient elle-même une regex avec ses règles de grammaire donc là je ne pige plus. La base c'est que la data soit une chaine quelconque et que la regex serve à indiquer comment y chercher des infos, pas qu'elle soit elle-même une regex !!!

    Bref comme jurassic pork, peut-être dire ce que tu as en entrée et ce que tu veux en sortie et là on pourra mieux comprendre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bref comme jurassic pork, peut-être dire ce que tu as en entrée et ce que tu veux en sortie et là on pourra mieux comprendre...
    Bah s'il y a bien une chose claire dans le message, c'est de quoi on part et ce qu'on veut obtenir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre habitué
    Femme Profil pro
    Ingénieur
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Par défaut
    (Re)Bonjour,

    Merci pour ces premiers retours.

    houla tout cela me paraît bien compliqué et en plus dans ton code il y a une erreur car tu fais une itération en changeant le dictionnaire de départ
    Effectivement, il y avait un problème de syntaxe dans mon exemple mais il n'est pas dans le code que j'utilise (je l'ai corrigé dans mon premier message).
    J'ai l'impression que vous cherchez un truc tout fait prêt à l'emploi alors qu'il suffirait de le coder (j'ai peut-être regardé ça en diagonale mais ça ne me paraît pas irréalisable).
    Je ne doute pas de pouvoir coder la solution, mais au niveau maintenance, si la fonction/méthode existe déjà, c'est toujours mieux.
    Dis nous ce que tu veux faire exactement avec des exemples : chaîne(s) de départ --> résultat(s) escomptés parce que tu n'utilises peut-être pas la meilleure méthode pour arriver à tes fins. C'est parfois aussi plus simple de ne pas utiiiser des groupes nommés : les groupes sont alors repérés dans l'ordre de lecture $1, $2 etc ...
    Bref comme jurassic pork, peut-être dire ce que tu as en entrée et ce que tu veux en sortie et là on pourra mieux comprendre...
    En voulant trop simplifier, je n'ai peut-être pas réussi à expliquer pourquoi cela semble si compliqué (mais il est plus facile de tester sur un exemple simplifié que sur un cas quasi-réel même s'il n'est pas de la même échelle).

    Pour revenir sur les objectifs, j'ai à ma disposition deux informations en provenance des utilisateurs :
    1. la liste des fichiers du répertoire à traiter (par exemple) :
    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
    files_list = ["pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc",
    "pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc",
    "pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc",
    "pression_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc",
    "pression_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc",
    "pression_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc",
    "temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc",
    "temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc",
    "temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc",
    "temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc",
    "temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc",
    "temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc",
    "temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197901-197903.nc",
    "temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197904-197906.nc",
    "temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197907-197909.nc"]
    2. L'expression régulière que suivent les fichiers (et qui détermine également la façon dont ils doivent être concaténés ensemble sur des périodes plus longues):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import re
    files_regexp = re.compile(r"(?P<variable>[^_]+)_(?P<frequence>[^_]+)_.*_(?P<grille>[^_]+)_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc")
    A partir de ces informations, je dois regrouper les noms de fichiers à concaténer en tenant compte des groupes définis dans l'expression régulière (sauf s'ils sont explicitement liés à une période ou une date).
    Ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from collections import defaultdict
    rep = defaultdict(list)
     
    for f in files_list:
        match_f = files_regexp.match(f)
        if match_f:
            other_matches = match_f.groupdict()
            dates_matches = {elt: match_f[elt] for elt in other_matches if "date" in elt.lower() or "period" in elt.lower()}
            for elt in dates_matches:
                del other_matches[elt]
            print(other_matches)
            index = tuple([other_matches[elt] for elt in sorted(list(other_matches))])
            rep[index].append(f)
    Et le résultat :
    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
    defaultdict(list,
                {('mensuelle',
                  'une-grille',
                  'pression'): ['pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc',
                                'pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc',
                                'pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc'],
                 ('journaliere',
                  'une-grille',
                  'pression'): ['pression_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc',
                                'pression_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc',
                                'pression_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc'],
                 ('mensuelle',
                  'une-grille',
                  'temperature'): ['temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc',
                                   'temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc',
                                   'temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc'],
                 ('journaliere',
                  'une-grille',
                  'temperature'): ['temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc',
                                   'temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc',
                                   'temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc'],
                 ('journaliere',
                  'une-autre-grille',
                  'temperature'): ['temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197901-197903.nc',
                                   'temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197904-197906.nc',
                                   'temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197907-197909.nc']})
    Je voudrais définir le template du nom de fichier concaténé à partir des mêmes informations, pour obtenir le dictionnaire suivant à la place :
    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
    defaultdict(list,
                {'pression_mensuelle_un_nom_de_modele_version-197901_une-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc': ['pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc',
                                                                                                                                         'pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc',
                                                                                                                                         'pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc'],
                 'pression_journaliere_un_nom_de_modele_version-197901_une-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc': ['pression_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc',
                                                                                                                                           'pression_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc',
                                                                                                                                           'pression_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc'],
                 'temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc': ['temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc',
                                                                                                                                            'temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc',
                                                                                                                                            'temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc'],
                 'temperature_journaliere_un_nom_de_modele_version-197901_une-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc': ['temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc',
                                                                                                                                              'temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc',
                                                                                                                                              'temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc'],
                 'temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc': ['temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197901-197903.nc',
                                                                                                                                                    'temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197904-197906.nc',
                                                                                                                                                    'temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197907-197909.nc']})
    Mon problème consiste donc à passer d'un dictionnaire à l'autre (si possible sans refaire l'analyse des expressions régulières, pour éviter de relire les noms des 5000 fichiers ou plus à chaque fois...).

    J'espère que le problème est plus clair comme cela.
    Je suis preneuse d'idées pour simplifier la résolution si vous en avez.

    Merci encore,
    GaelleRig

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par GaelleRig Voir le message
    J'espère que le problème est plus clair comme cela.
    Oui là pour moi c'est pas mal. Désolé, n'étant pas omniscient comme l'autre, j'avais besoin de cette explication pour comprendre.

    Que penses-tu de ceci...

    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    files_list = (
    	"pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc",
    	"pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc",
    	"pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc",
    	"pression_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc",
    	"pression_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc",
    	"pression_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc",
    	"temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc",
    	"temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc",
    	"temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc",
    	"temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc",
    	"temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc",
    	"temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc",
    	"temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197901-197903.nc",
    	"temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197904-197906.nc",
    	"temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197907-197909.nc",
    )
     
    filtre="(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*)"
    info=("pression", "temperature")
    frequence=("mensuelle", "journaliere")
    grille=("une-grille", "une-autre-grille")
     
    import itertools
    import re
    result=dict()
    for (file, i, f, g) in itertools.product(files_list, info, frequence, grille):
    	key="%s_%s_un_nom_de_modele_version-197901_%s_%s.nc" % (i, f, g, filtre)
    	if re.match(key, file): result.setdefault(key, list()).append(file)
    # for
    for (k, v) in result.items():
    	print("%s: [%s]\n" % (k, "".join("\n\t%s" % x for x in v)))

    Résultat
    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
    pression_mensuelle_un_nom_de_modele_version-197901_une-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc: [
    	pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc
    	pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc
    	pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc]
     
    pression_journaliere_un_nom_de_modele_version-197901_une-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc: [
    	pression_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc
    	pression_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc
    	pression_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc]
     
    temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc: [
    	temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc
    	temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc
    	temperature_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc]
     
    temperature_journaliere_un_nom_de_modele_version-197901_une-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc: [
    	temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197901-197903.nc
    	temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197904-197906.nc
    	temperature_journaliere_un_nom_de_modele_version-197901_une-grille_197907-197909.nc]
     
    temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_(?P<date_debut>\d{4}\d*)[-_](?P<date_fin>\d{4}\d*).nc: [
    	temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197901-197903.nc
    	temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197904-197906.nc
    	temperature_journaliere_un_nom_de_modele_version-197901_une-autre-grille_197907-197909.nc]
    ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 214
    Par défaut
    je n'ai peut-être pas compris mais la finalité n'est-ce pas par exemple de mettre le contenu de ces trois fichiers :
    ['pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197903.nc',
    'pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197904-197906.nc',
    'pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197907-197909.nc']

    Dans un fichier qui se nommerait pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197909.nc ?

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Dans un fichier qui se nommerait pression_mensuelle_un_nom_de_modele_version-197901_une-grille_197901-197909.nc ?
    Il y a la pression mensuelle, journalière, la température mensuelle, journalière, et tout ça pour "une grille" puis "une-autre-grille". Et peut-être que demain ça peut évoluer encore...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par GaelleRig Voir le message
    A partir de ces informations, je dois regrouper les noms de fichiers à concaténer en tenant compte des groupes définis dans l'expression régulière (sauf s'ils sont explicitement liés à une période ou une date).
    Repartez de test_regexp pour en faire un dictionnaire où les clefs seront les groupes et les valeurs le bout de regexp associé. qui s'appellera dico_regexp avec la propriété ''.join(dico_regexp.values()) = test_regexp.

    On applique test_regexp pour fabriquer my_groups et en sortir le groupe qu'on ne veut pas.

    La nouvelle regexp devrait se fabriquer via ''.join(ChainMap(my-groups, dico_regexp).values()) = test_regexp.
    ChainMap étant une class de la bibliothèque collections.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 540
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 540
    Par défaut
    j'ai du mal à comprendre (entre autres) la notion de "sauf si liés explicitement à une période" par rapport à ton exemple.
    pour moi, ils sont tous liés à une période explicite, non ?

    Si je reformule ton besoin: concaténer (dans l'ordre des périodes) les fichiers dont le nom est identique jusqu'à l'indication de période.
    Donc le nom du fichier peut être divisé en seulement 2 (ou 3) sous ensembles: le nom (regroupant l'ensemble de ce que tu as appelé groupes) et la période (éventuellement à décomposer en début et fin)
    En classant les fichiers par ordre alphabétique ainsi, on devrait arriver au résultat voulu

  12. #12
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    C'est quand même difficile quand un problème n'est pas exprimé de manière concrète et que purement technique. Personnellement je n'ai pas compris l'objectif utilisateur.

    1. Je suis curieux de savoir comment le script est exécuté ? via des paramètres ?
    2. C'est pas pour du développement web au moins ?
    3. À chaque exécution on semble charger les 5000 fichiers ? puis 10000, 100000 ? limite une petite base de données sqlite, semble intéressante...


    Et comme Sve@r, j'ai vraiment l'impression qu'on prend le problème à l'envers... et c'est peut-être pour cela qu'on a des difficultés à comprendre la logique demandée.

    Je n'ai pas compris pourquoi concrètement on génère des pattern d'expressions régulières, ça n'a pas de sens ! Faut m'expliquer le pourquoi de cette demande.

    Bref dans cette demande j'attends toujours le petit déclic pour comprendre, car malgré les essais de @GaelleRig, je n'arrive toujours pas à comprendre l'intérêt de faire tout cela !

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 540
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 540
    Par défaut
    en d'autres termes, présente-nous plutôt le cheminement utilisateur sans rentrer dans le "comment faire":
    exemple:
    On a une liste de fichiers dont le nom se compose en [type_mesure]_[periodicite_mesure]_[modele]_[version]_[periode_mesure].nc
    On doit présenter à l'utilisateur tels éléments pour tel but (a priori sélectionner certains éléments, ou un ordre des éléments?)
    On doit alors lui présenter tel résultat selon son choix (exemple choix utilisateur avec exemple de résultat attendu pour l'utilisateur)
    ...

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/11/2008, 21h00
  2. Remplacer des carractères dans une chaine
    Par Superzobi dans le forum C++
    Réponses: 23
    Dernier message: 02/05/2007, 16h35
  3. [Tableaux] Remplacer des variables dans une chaine
    Par Ricou13 dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2007, 21h48
  4. [RegEx] Remplacer des caractères dans une string
    Par jexl dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2007, 22h26
  5. Réponses: 4
    Dernier message: 29/08/2006, 17h44

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