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 :

Découper une chaîne de caractères avec ponctuations


Sujet :

Python

  1. #1
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Septembre 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut Découper une chaîne de caractères avec ponctuations
    Bonjour,

    Je voudrais découper une chaîne de caractères par des séparateurs comme les espaces, des signes de poncutations, le point, la virgule. Chaque ligne aura un seul mot (un token), tous les séparateurs seront également affichés dans chaque ligne.

    Ex : chaîne :Il march, elle marche.

    l'affichage sera comme :

    Il
    marche
    ,
    elle
    marche
    Je n'arrive pas à afficher un token par ligne, mais ca a affiché un caractère par ligne.

    Merci de votre aide ? Merci

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def tokenize(a):
        ponc = [' ','.',',','!','?',';',':']
        for x in a:
            if x[-1] in ponc:
                #print(x[0:-1])
                print(x[-1])
            else:
                print(x)
    print (tokenize("Une chaîne de caractère va être séparée par un espace, une virgule, un pont, etc."))

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par lucie34 Voir le message
    Je voudrais découper une chaîne de caractères par des séparateurs comme les espaces, des signes de poncutations, le point, la virgule. Chaque ligne aura un seul mot (un token), tous les séparateurs seront également affichés dans chaque ligne.

    Ex : chaîne :Il marche, elle marche.

    l'affichage sera comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Il
    marche
    ,
    elle
    marche
    Déjà là il y a un souci. En effet, la virgule comme le point sont des séparateurs. Mais dans le résultat montré, la virgule apparait tandis que le point n'apparait pas. Il y a donc incohérence (ou plutôt inéquité) entre les séparateurs. Or en informatique, rien n'est plus difficile à programmer que l'inéquité (en général ça se traduit par des "if" dans tous les sens).

    S'il n'y a pas inéquité (donc erreur de ta part dans l'affichage du but à atteindre), alors je pense à priori (donc l'idée n'est pas complètement fixée) que le plus simple serait de copier la chaine d'origine dans une chaine de travail tout en uniformisant tous les séparateurs (donc convertir tout ce qui est virgule, point-virgule, etc en un séparateur unique) ; puis découper la chaine de travail sur cet unique séparateur.
    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
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    On peut aussi utiliser des regexp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> import re
    >>> text = "Il march, elle marche."
    >>> ponc = [' ','.',',','!','?',';',':']
    >>> re.split(r'([%s])' % '|'.join(ponc), text)
    ['Il', ' ', 'march', ',', '', ' ', 'elle', ' ', 'marche', '.', '']
    >>>

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

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Moi je ferais plutôt ça pour sucrer les espaces et se passer de ponc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import re
    >>> text = 'Il marche, elle marche.'
    >>> re.findall(r'\w+|\S', text)
    ['Il', 'marche', ',', 'elle', 'marche', '.']
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    En effet, c'est bien mieux.

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

  6. #6
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Septembre 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Oh, j'ai oublié de mettre le point pour l'affichage souhaité dans l'exemple que j'ai donné.


    Citation Envoyé par Sve@r Voir le message
    Bonjour


    Déjà là il y a un souci. En effet, la virgule comme le point sont des séparateurs. Mais dans le résultat montré, la virgule apparait tandis que le point n'apparait pas. Il y a donc incohérence (ou plutôt inéquité) entre les séparateurs. Or en informatique, rien n'est plus difficile à programmer que l'inéquité (en général ça se traduit par des "if" dans tous les sens).

    S'il n'y a pas inéquité (donc erreur de ta part dans l'affichage du but à atteindre), alors je pense à priori (donc l'idée n'est pas complètement fixée) que le plus simple serait de copier la chaine d'origine dans une chaine de travail tout en uniformisant tous les séparateurs (donc convertir tout ce qui est virgule, point-virgule, etc en un séparateur unique) ; puis découper la chaine de travail sur cet unique séparateur.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Septembre 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Je ne peux pas utiliser split.. des fonctions définies dans Python.
    J'ai trouvé cette solution (voir en bas), mais il y a encore un petit problème. Chaque mot est bien présenté par ligne, avec les signes de ponctuations, mais comme je peux ne pas afficher quand c'est l'espace, car cela donne des lignes vides quand c'est l'espace.

    Une autre question dans mon code sur mot="" : pourriez vous me dire, que cela signifie ? J'ai testé par hasard, mais sans rien comprendre, et pourquoi il faut aussi mettre mot="" dans if.
    Merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def tokenize(chaine):
    	ponc = [' ','.',',','!','?',';',':']
    	mot=""
    	for char in chaine:
    		if char in ponc:
    			print(mot)
    			print(char)
    			mot=""
    		else:
    			mot = mot + char			
    print (tokenize("il marche, elle marche."))

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lucie34 Voir le message
    J'ai trouvé cette solution (voir en bas), mais il y a encore un petit problème. Chaque mot est bien présenté par ligne, avec les signes de ponctuations, mais comme je peux ne pas afficher quand c'est l'espace, car cela donne des lignes vides quand c'est l'espace.
    Non, ce n'est pas que "ça donne une ligne vide quand c'est l'espace", c'est "ça donne une ligne vide quand il y a deux caractères de ponctuation qui se suivent". Ce serait bien que tu comprennes ce que tu "trouves". Dans cette solution tu balayes ta chaine caractère par caractère. Si le caractère n'est pas de la ponctuation tu le rajoutes à "mot". Si c'est de la ponctuation alors tu affiches le mot construit précédemment et tu le réinitialises (ceci qui répond d'ailleurs à ta seconde question).
    Dans la chaine "il marche, elle marche." il y a deux caractères de ponctuation à suivre (la virgule et l'espace). Donc quand "ton" programme arrive à l'espace le mot a déjà été affiché lors de la virgule et il est alors vide. Donc ça affiche un mot vide.
    Suffit donc de tester, lors de l'affichage, si le mot est/n'est pas vide. Et éviter d'afficher aussi ce que renvoie la fonction car elle ne renvoie rien
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def tokenize(chaine):
    	ponc = (' ','.',',','!','?',';',':')
    	mot=""
    	for char in chaine:
    		if char not in ponc:
    			mot = mot + char			
    		elif mot:
    			print(mot)
    			mot=""
     
    tokenize("il marche, elle marche.")

    Citation Envoyé par lucie34 Voir le message
    J'ai testé par hasard, mais sans rien comprendre
    C'est bien ça le drame.
    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]

  9. #9
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Septembre 2018
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    Bonjour,
    Dans mon code, je ne comprend pas pourquoi lorsqu'il y a deux caractères de ponctuations qui se suivent, une ligne vide apparaît.
    Pourriez vous me donner un exmple ? Merci
    Une autre problème : Si je ne mets pas le point à la fin de la phrase, le dernier mot n'apparaît pas.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lucie34 Voir le message
    Citation Envoyé par Sve@r Voir le message
    Donc quand "ton" programme arrive à l'espace le mot a déjà été affiché lors de la virgule et il est alors vide. Donc ça affiche un mot vide.
    Dans mon code, je ne comprend pas pourquoi lorsqu'il y a deux caractères de ponctuations qui se suivent, une ligne vide apparaît.
    Oh ? Tu les lis les mots qu'on écrit ou bien ils font juste un vague "flonflon" dans ta tête ?


    Citation Envoyé par lucie34 Voir le message
    Pourriez vous me donner un exmple ? Merci
    il marche, elle marche.

    Citation Envoyé par lucie34 Voir le message
    Une autre problème : Si je ne mets pas le point à la fin de la phrase, le dernier mot n'apparaît pas.
    Ben oui. Parce que tu n'affiches le mot que lorsque tu rencontres un caractère de ponctuation. Donc si pas de caractère rencontré alors pas d'affichage.
    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]

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/12/2013, 19h03
  2. Découper une chaîne de caractères
    Par gege2061 dans le forum Langage
    Réponses: 9
    Dernier message: 07/03/2008, 19h59
  3. Extraction d'une chaîne de caractère avec SQL
    Par opeo dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 28/07/2006, 15h36
  4. [VBA-E] découper une chaîne de caractère
    Par jagwar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/07/2006, 14h07
  5. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 09h58

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