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 :

Expression régulière pour Notepad++


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 71
    Par défaut Expression régulière pour Notepad++
    Bonjour à tous. Je n'ai pas trouvé de rubrique notepad++ donc je ne suis pas sur de poster dans la bonne section.

    Un problème qui me semblait simple me donne en ce moment des nœuds à la tête :
    J'ai une ligne dans laquelle je souhaite détecter le "!" et suite à cela toutes les occurrences de 6 chiffres se trouvant après un ":"

    23/06/2021!06:31:00!872701!4125:063100,4143,101,207,225,229,303,325,329,441:252222

    Cette expression fonctionne parfaitement : (:[0-9]{6})
    Cependant dès que j'essaye de détecter le "!" en le rajoutant devant l'expression cela ne marche plus.

    Merci d'avance pour votre aide.
    Bonne journée à tous.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par neflerine Voir le message
    J'ai une ligne dans laquelle je souhaite détecter le "!" et suite à cela toutes les occurrences de 6 chiffres se trouvant après un ":"
    Que signifie "suite à cela" ??? Autant dans le langage courant rester dans le flou ça peut passser, autant en informatique ça ne passe plus.

    Citation Envoyé par neflerine Voir le message
    23/06/2021!06:31:00!872701!4125:063100,4143,101,207,225,229,303,325,329,441:252222

    Cette expression fonctionne parfaitement : (:[0-9]{6})
    Cependant dès que j'essaye de détecter le "!" en le rajoutant devant l'expression cela ne marche plus.
    Tu aurais pu poster ton exemple car là on est obligé d'en rester à des suppositions. Donc si comme je le suppose tu as écrit !(:[0-9]{6}) il est évident que ça ne peut pas marcher puisque dans ton exemple, le caractère "!" n'est pas suivi du caractère ":". D'où la demande de précision de ton "suite à cela". Car c'est ce "suite à cela" qu'il va falloir exprimer sous forme de regex.
    Par exemple !.{0,}(:[0-9]{6}) signifiant "point d'exclamation suivi de 0 à n caractères quelconques (ce fameux "suite à cela") puis dans lesquels survient un double point suivi de 6 chiffres" pourrait donner un résultat intéressant...
    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]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ah on peut faire ça avec Notepad++ c'est cool ! Je vois pas en quoi ça me servirait mais bon ^^

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 71
    Par défaut
    Alors tout d'abord je m'excuse d'avoir émis une demande non claire, et je comprends totalement la réaction.

    En fait je souhaite détecter ce qui est en gras après un point d'exclamation comme ci-dessous :

    23/06/2021!06:31:00!872701!4125:063100,4143,101,207,225,229,303:111111,325,329,441:252222


    Voila le début d'une ligne correspond à une date et à son identifiant et les données commencent après le point d'exclamation.
    Sur certaines données (chacune séparée par une virgule), il y a parfois un horaire représenté par un ":" suivi de 6 chiffres HHMMSS

    J'aimerais supprimer ces horaires des lignes.
    La regex !.{0,}(:[0-9]{6}) n'a pas fonctionné chez moi pour supprimer tous les horaires de la ligne

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne suis pas sûr d'avoir trouvé une solution élégante, mais au moins, elle a l'air de marcher:

    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
    import re
     
    ch = "23/06/2021!06:31:00!872701!4125:063100,4143,101,207,225,229,303:111111,325,329,441:252222"
     
    motif = r"(:[0-9]{6})"
    regex = re.compile(motif)
    horaires = []
    i = ch.find("!")
    if i>=0:
        # la chaine comporte un "!" => on cherche les horaires à la suite
        while True:
            x = regex.search(ch, i)
            if x is None:
                break # pas d'autres horaires
            horaires.append([x.group(1), x.start(1), x.end(1)])
            print(x.group(1), x.start(1), x.end(1))
            i = x.end(1)
    print()    
    # suppression des sous-chaines trouvées (parcours à l'envers)
    for horaire, debut, fin in horaires[::-1]:
        ch = ch[:debut] + ch[fin:]
    print()
    print(ch)
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    :063100 31 38
    :111111 63 70
    :252222 82 89
     
    23/06/2021!06:31:00!872701!4125,4143,101,207,225,229,303,325,329,441
    Le "search" est intéressant parce qu'il renvoie un objet "match" qui permet non seulement de connaître la sous-chaine trouvée, mais aussi l'endroit où elle se trouve (start, end)

    C'est ce qui permet de supprimer toutes les sous-chaines trouvées, à condition bien sûr, de parcourir la liste des sous-chaines à l'envers (sinon, les indices seraient faux dès la 2ème sous-chaine).

    Le motif regex sélectionné ici est peut-être imparfait. Par exemple, si l'horaire est suivi par un chiffre, ce n'est peut-être pas un horaire. On peut donc préciser que l'horaire cherché doit être suivi soit par autre chose qu'un chiffre (une virgule par exemple), soit par la fin de la chaine. Dans ce cas, le motif serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    motif = r"(:[0-9]{6})([^0-9]|$)"
    Ce qui donne ici le même résultat.

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    hello,

    Citation Envoyé par neflerine Voir le message
    Alors tout d'abord je m'excuse d'avoir émis une demande non claire, et je comprends totalement la réaction.

    En fait je souhaite détecter ce qui est en gras après un point d'exclamation comme ci-dessous :

    23/06/2021!06:31:00!872701!4125:063100,4143,101,207,225,229,303:111111,325,329,441:252222


    Voila le début d'une ligne correspond à une date et à son identifiant et les données commencent après le point d'exclamation.
    Sur certaines données (chacune séparée par une virgule), il y a parfois un horaire représenté par un ":" suivi de 6 chiffres HHMMSS

    J'aimerais supprimer ces horaires des lignes.
    La regex !.{0,}(:[0-9]{6}) n'a pas fonctionné chez moi pour supprimer tous les horaires de la ligne


    Ta demande n'est pas très claire :
    1 - Pourquoi veux tu te synchroniser sur un ! alors que tu recherches les horaires ( un ":" suivi de 6 chiffres HHMMSS) ? et si oui lequel (il y en a plusieurs sur la ligne) ?
    2 - Dans ton exemple il y a :252222 ? une 25ème heure

    si le ! n'a pas d'importance ce code fait le boulot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    strtest  =  "23/06/2021!06:31:00!872701!4125:063100,4143,101,207,225,229,303:111111,325,329,441:252222"
    p = re.compile('(:\d{6})')
    print(re.sub(p, "", strtest))
    résultat :
    23/06/2021!06:31:00!872701!4125,4143,101,207,225,229,303,325,329,441
    Ami calmant, J.P

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Je vois pas en quoi ça me servirait mais bon ^^
    Tous les éditeurs de développement ("vi", "notepad++") connaissent les regex. Par exemple une fois, j'avais un fichier de sous-titres (donc timecodé) mais une traduction l'avait modfié et tous les timecodes style "hh:mn:ss" étaient devenus "hh: mm: ss" et le sous-titre ne passait plus dans VLC. Un coup de regex dans notepad++ et ça l"a réparé.

    Citation Envoyé par neflerine Voir le message
    23/06/2021!06:31:00!872701!4125:063100,4143,101,207,225,229,303:111111,325,329,441:252222
    La regex !.{0,}(:[0-9]{6}) n'a pas fonctionné chez moi pour supprimer tous les horaires de la ligne
    Normal, tu avais présenté ton besoin comme devoir trouver "un" groupe de chiffres et ta ligne en contient trois. Et comme la recherche .{0,} est gloutonne (elle va le plus loin possible) je pense que ça supprime le groupe "252222" en laissant intact les groupes "063100" et "111111". Sauf que je ne pense pas qu'une regex exprimant "point d'exclamation puis n'importe quoi puis deux points puis 6 chiffres, ces éléments sauf le point d'exclamation pouvant eux-mêmes être répétés" puisse exister.
    Mais en répétant cette regex autant de fois qu'il le faut...
    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
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2016
    Messages : 71
    Par défaut
    Merci pour vos réponses.

    Je souhaite me synchroniser sur le ! pour 2 raisons :
    1/ car ce qu'il y a à gauche du ! est susceptible de changer dans le temps
    2/ pour apprendre à me caler à l'endroit que je veux en regex (volonté académique ?)

    Pour la petite histoire il s'agit de ma compagne qui travaille dans les itinéraires de trains, et chaque nombre à droite du ! correspond à un itinéraire du train.
    Cependant un collègue parti à la retraite qui à développé un logiciel en pascal qui analyse les itinéraires n'a laissé que l’exécutable de son logiciel (méchant papi) et en + à fait une erreur dans son code en laissant les horaires.

    Du coup je voulais juste une petite regex notepad++ qui supprime les horaires des fichiers. Ma regex initiale fonctionne très bien, mais le jour où le format changera, j'aimerais pouvoir me caler sur ce qu'il y a à droite du !

    Vos codes en python sont très intéressant pour moi, et je vais les potasser, cependant dans son entreprise, python n'est pas installé, voila pourquoi je souhaite rester sur np++ tout simple.

    A la reflexion j'aurais du expliquer tout ceci dans mon premier message, j'espère que tout est clarifié et que les trains arriveront à l'heure

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/07/2019, 10h42
  2. [RegEx] Expression régulière pour supprimer des doublons
    Par cbroissa dans le forum Langage
    Réponses: 5
    Dernier message: 20/05/2017, 01h59
  3. [RegEx] Simple expression régulière pour ereg_replace
    Par aurapp dans le forum Langage
    Réponses: 6
    Dernier message: 12/03/2006, 12h34
  4. Expression régulière pour récupérer le nom d'un fichier
    Par calimero2611 dans le forum Langage
    Réponses: 5
    Dernier message: 24/02/2006, 19h00
  5. Expression Régulière pour float
    Par zebiloute dans le forum Langage
    Réponses: 5
    Dernier message: 26/09/2005, 14h03

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