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 :

[re] : split de strings


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2019
    Messages : 3
    Par défaut [re] : split de strings
    Bonjour,

    J'ai besoin de split des strings avec un pattern étrange en python.
    J'essaie donc de le réaliser avec le module "re".

    Voici le genre de strings que j'ai en entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    text = "@sFEMERGENCY>"
    text2 = "NOAROBASE>"
    text3 = "@sD[ ]@s9@h1c"
    text4 = "@sM@s9@s0<CONNECTION@sD@h1C"
    text5 = " @sN"
    Voici ce que j'aimerais en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ['@sFEMERGENCY>']
    ['NOAROBASE>']
    [ '@sD[ ]', '@s9@h1c']
    [ '@sM@s9@s0<CONNECTION', '@sD@h1C']
    [' ', '@sN']
    Les "@s" sont toujours suivis par UN seul de ces caractères : @s[ABCDEF089MN].
    Il peut y en avoir plusieurs (text4) comme il peut ne pas y en avoir au début de la string (text5, il y a un espace) voire ne pas y en avoir du tout (text2).

    Le "@h" est lui suivi de deux caractères : @h[0-9,A-F][0-9,A-F], il peut aussi y en avoir plusieurs.

    En ce qui concerne le "texte" des strings, il peut y avoir de tout .. A-Z, [], <>, /, ,-, etc. mais pas de "@".
    J'ai essayé de nombreuses choses avec les méthodes split et findall mais je n'ai pas réussi à obtenir le résultat voulu...

    Quelqu'un a-t-il une idée de la regex a utiliser ?

    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Bonjour Rzistank,

    Je ne vois pas trop la logique de tes splits
    Si tu splites sur '@s' tu ne les retrouves pas dans le résultat (le résultat ne contient pas le séparateur et c'est normal) et pour le moins dans le cas 5 tu devrais attendre ['M', '9', '0<CONNECTION', 'D@h1C']

    Vu les résultats que tu attends, à mon avis tu ne pourras pas le faire en une fois et même si tu y arrives, ca risque fortement de ne pas être lisible.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2019
    Messages : 3
    Par défaut
    Bonjour Fifan,

    Je ne vois pas trop la logique du pattern non plus ... Je n'ai malheureusement pas de docs.

    L'inconvénient est que je n'ai pas trop d'idée sur comment procéder pour avoir ces outputs autrement.

    Pour le moment en utilisant le pattern :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pattern = r"((@s.)+[A-Z><\[\] ]+)"
    J'arrive à obtenir ces résultat avec la méthode split :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ['', '@sFEMERGENCY>', '@sF', '']
    ['NOAROBASE>']
    ['', '@sD[ ]', '@sD', '@s9@h1c']
    ['', '@sM@s9@s0<CONNECTION', '@s0', '@sD@h1C']
    [' @sN']
    Sachant, qu'ici seul le dernier résultat me pose soucis car les "@s." seul et "" sont ignorés par la suite.
    (Les @s indiquent des configurations sur le texte qui suit : taille, couleur, ...)

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    En prenant le temps de parser les textes tu te compliqueras moins la vie qu'avec une regex.

    Et cela reste de toutes façons extrêmement rapide.

    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
    16
    17
    18
     
    texts = ["@sFEMERGENCY>",
            "NOAROBASE>",
            "@sD[ ]@s9@h1c",
            "@sM@s9@s0<CONNECTION@sD@h1C",
            " @sN"]
     
    for text in texts:
        if not "@" in text:
            print([text])
            continue
        out = text
        offset = 0
        for idx, l in enumerate(text[:-2]):
            if idx and text[idx:idx+2] == "@s" and text[idx+2] in "ABCDEF089MN":
                out = out[0:idx+offset] + "*" + text[idx:]
                offset += 1
        print(out.split("*"))
    Qui donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ['@sFEMERGENCY>']
    ['NOAROBASE>']
    ['@sD[ ]', '@s9@h1c']
    ['@sM', '@s9', '@s0<CONNECTION', '@sD@h1C']
    [' ', '@sN']

  5. #5
    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 VinsS Voir le message
    Qui donne ça
    Joli résultat
    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]

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Si j'ai bien compris la question (ce qui est loin d'être sûr):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.findall(r'(?:@s[A-FMN089]|^).*?(?=@s[A-FMN089]|$)', text)

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2019
    Messages : 3
    Par défaut
    Bonjour CosmoKnacki,

    Oui c'est presque ça mais ce n'est pas le résultat attendu pour le text4.

    J'ai passé le sujet en "résolu" il y a quelques jours puisque j'y suis arrivé sans utiliser re.split ou re.findall (code un peu indigeste).

    Merci d'avoir pris du temps pour essayer de m'aider

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

Discussions similaires

  1. split de String
    Par Zorrander dans le forum Langage
    Réponses: 3
    Dernier message: 08/10/2014, 19h55
  2. [C#] Split de string html en C# .Net
    Par same66 dans le forum Débuter
    Réponses: 4
    Dernier message: 06/04/2012, 08h56
  3. Compter nombre Split dans string
    Par bouuuh dans le forum C#
    Réponses: 3
    Dernier message: 14/02/2011, 21h16
  4. Réponses: 9
    Dernier message: 27/12/2008, 17h09
  5. [débutant] Split et string[]
    Par remsrock dans le forum C#
    Réponses: 7
    Dernier message: 11/07/2008, 16h51

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