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 :

Chaîne de caractères


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Chaîne de caractères
    Bonjour, j'ai la chaîne de caractères suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str1 = "'<123.456.789.AABBCC"
    Existe-t-il une méthode qui me permet de récupérer une partie de cette chaîne de caractères dans une nouvelle variable ? Si oui, pouvez-vous me dire laquelle et m'expliquer comment elle fonctionne ?

    Exemple de résultat souhaité :

    D'avance je vous remercie de votre aide.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a plusieurs méthodes, mais il faudrait mieux préciser les critères d'extraction.

    Par exemple, s'il s'agit d'extraire la chaine qui se trouve entre l'indice 2 et l'indice 12 (les indices commencent à 0):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    str1 = "'<123.456.789.AABBCC"
    print str1[2:13]
    123.456.789
    S'il s'agit d'extraire tout ce qui se trouve entre le 1er '<' et le dernier '.':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i1 = str1.find('<')+1
    i2 = str1.rfind('.')
    print str1[i1:i2]
    123.456.789
    Et si on veut récupérer la chaine qui commence par un chiffre et se termine par un chiffre et qui ne contient que des chiffres et des points, c'est un petit peu plus compliqué: on passe par les expressions régulières:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import re
    x = re.search(r"([^0-9])([0-9\.]+[0-9])([^0-9])", str1)
    print x.groups()[1]
    123.456.789
    Mais on peut toujours, bien sûr, faire une fonction d'extraction qui cherche, caractère par caractère, le 1er et le dernier nombre.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Merci pour ces propositions. La dernière partie est effectivement un peu plus compliquée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import re
    x = re.search(r"([^0-9])([0-9\.]+[0-9])([^0-9])", str1)
    print x.groups()[1]
    Pourriez-vous me donner un peu plus d'explications sur ce que font exactement ces lignes d'instructions ?

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    ([^0-9]) => n'importe quel caractère sauf un chiffre
    ([0-9\.]+[0-9]) => plusieurs caractères numériques et '.', terminé par un caractère
    ([^0-9]) => n'importe quel caractère sauf un chiffre

    Les parenthèses identifient les groupes: il y a donc 3.

    Une fois le motif reconnu:
    groupe 0 => '<'
    groupe 1 => '123.456.789'
    groupe 2 => '.'

    et on retient le groupe 1 du milieu => '123.456.789'

    Info complémentaires ici: http://docs.python.org/library/re.html#module-re
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Bonjour, je me reporte à votre dernier post :

    ([^0-9]) => n'importe quel caractère sauf un chiffre
    Une fois le motif reconnu:
    groupe 0 => '<'
    groupe 1 => '123.456.789'
    groupe 2 => '.'
    Etant donné que str1 = "'<123.456.789.AABBCC", que se passe-t-il pour les caractères AABBCC ? Ne sont-ils jamais pris en compte lors de la constitution des groupes ?

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Non, puisque j'ai construit le motif comme ça: la sous-chaine cherchée est composée de chiffres et de points, entourée par 2 caractères "non-chiffres".

    Pourquoi voudriez-vous que les autres caractères soient pris en compte?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Le doute vient du fait que vous spécifiez à deux reprises avec ([^0-9]) que vous voulez n'importe quel caractère sauf un chiffre. Pour moi cela signifie que les caractères alphabétiques AABBCC (donc non numériques) doivent être prises en compte. Or celles-ci ne le sont pas. Votre dernier post m'aide à y voir un peu plus clair. Et si j'avais voulu avoir uniquement le résultat suivant : AABBCC, à quoi ressemblerait le motif ?

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    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 : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import re
    x = re.search(r"([A-Z]+)", str1)
    print x.groups()[0]
    je suppose
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Avant de fabriquer un motif, il faut pouvoir décrire avec des mots ce qu'on cherche. Alors, essayons:

    On cherche:
    - un mot composé de une ou plusieurs lettre(s) majuscules => '[A-Z]+'
    - limité à gauche par un point => '.'
    - limité à droite par la fin de ligne => '$'

    On entoure le motif du mot par des parenthèses pour faire un groupe afin de faciliter l'extraction

    Ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import re
    str1 = "'<123.456.789.AABBCC"
    x = re.search(r".([A-Z]+)$", str1)
    if x==None:
        print "Echec!"
    else:
        print x.groups()[0]
    Ce qui affiche:

    [Edit] fred1599 a raison: on peut se passer du '.' à gauche: il suffit que ce ne soit pas un A-Z. Pour la droite: sans le '$', on peut trouver le mot cherché au milieu de la chaine, qui sera aussi limité par un caractère non-A-Z.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Bonjour, et merci pour toutes vos réponses.

    @ Tyrtamos : J'utilise Python 3.2. Lorsque j'exécute les lignes de codes que vous avez proposées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import re
    str1 = "'<123.456.789.AABBCC"
    x = re.search(r".([A-Z]+)$", str1)
    if x==None:
        print "Echec!"
    else:
        print x.groups()[0]
    je reçois un message d'erreur : "Invalid syntax" (mauvaise syntaxe). Pourtant j'ai scrupuleusement respecté la syntaxe. La version Python que j'utilise est-elle pour quelque chose ?

  11. #11
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Ben oui, en python3, print n’est plus un mot-clé, mais une fonction, qu’il faut donc appeler comme telle*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import re
    str1 = "'<123.456.789.AABBCC"
    x = re.search(r".([A-Z]+)$", str1)
    if x==None:
        print("Echec!")
    else:
        print(x.groups()[0])

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    D'accord, bien compris pour la fonction print et effectivement ça fonctionne après essai. Pour bien cerner la question de la construction des sous chaînes de caractères à partir de motifs, je vous propose ces quelques nouveaux exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    str1 = "vendredi 13 Janvier 2012 à 16:45:50 -0800 (PST)"
    str2 = "De: mnat.legrand@yahoo.fr"
    str3 = "A: fab.pierre@gmail.com, gg.giraud@hotmail.fr, vcas@yahoo.com
                  fifi.perrec@yahoo.fr"
    str4 = "Objet: Re: Invitation pour anniversaire"
    str5 = "Objet: 2- Enquête/Information E-Mail 5-14- 01"
    Quel(s) serait/seraient le/les motifs pour extraire:
    de str1 : "13 Janvier 2012", "16:45:50"
    de str2 : "mnat", "legrand", "yahoo.fr"
    de str3 : IDEM que pour str2
    de str4 : "Invitation pour anniversaire"
    de str5 : IDEM que pour str4

    D'avance je vous remercie pour votre aide.

  13. #13
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    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 : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Allez je fais le 1er

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> str1 = "vendredi 13 Janvier 2012 à 16:45:50 -0800 (PST)"
    >>> pattern = "(\d{2} \w+ \d{4})"
    >>> x = re.search(pattern, str1)
    >>> print(x.groups()[0])
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    @ Fred : merci pour la suggestion. J'enlève le "à" de str1 ce qui me donne maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str1 = "vendredi 13 Janvier 2012 16:45:50 -0800 (PST)"
    Y-aurait-il un motif tout aussi simple que celle que vous proposez pour extraire l'heure ? J'ai tenté le motif suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    str1 =  "vendredi 13 Janvier 2012 16:45:50 -0800 (PST)"
    pattern1 = "(([0-9]) ([0-9 \:] + [0-9 \:] + [0-9]) (^0-9))"
    x = re.search(pattern1, str1)
    print(x.groups()[1])
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    str1 =  "vendredi 13 Janvier 2012 16:45:50 -0800 (PST)"
    pattern1 = "(\d{4} ([0-9 \:] + [0-9 \:] + [0-9]) (^0-9))"
    x = re.search(pattern1, str1)
    print(x.groups()[1])



    Pour str2, j'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    str2 =  "De: mnat.legrand@yahoo.fr"
    pattern2 = "(([A-z \:]) ([a-z]+) ([. \a-z]))"
    x = re.search(pattern2, str2)
    print(x.groups()[1])

    Cela ne me donne pas les résultats attendus. Où se trouve(nt) l'/les erreur(s)?

  15. #15
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    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 : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    pattern = "(\d\d:\d\d:\d\d)"
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Je m'adresse de nouveau à vous car à ce jour je n'ai toujours pas trouvé l'expression régulière correcte en python qui me permette de chercher et d'extraire de la chaîne de caractères str2 les éléments suivants : "mnat", "legrand", "yahoo.fr" (c.f. post N° 12). Pourriez-vous me dépanner ? D'avance je vous remercie.

  17. #17
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r"(\w+)\.(\w+)@([\w.]+)"
    Autrement dit, un premier groupe de caractères alphanumériques (le \w), un point, un deuxième groupe similaire, une arobase, et un dernier groupe de caractères alphanumériques ou point. Le principe d’une adresse email étant de ne pas comporter d’espaces…

    Mais perso, je ferais plutôt

    Pour récupérer d’un coup tout la partie gauche de l’email, et ensuite un simple .split('.') permet de couper aux points (les regex ne sont pas adaptées pour capturer un nombre inconnus de groupes similaires).

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 2
    Dernier message: 18/10/2003, 14h42
  3. Chaînes de caractères
    Par Zazeglu dans le forum C
    Réponses: 3
    Dernier message: 28/08/2003, 16h20
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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