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 :

Parcourir un string et prélever tous les mots entre guillemets


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Rien en rapport pour le moment
    Inscrit en
    Mars 2021
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Rien en rapport pour le moment

    Informations forums :
    Inscription : Mars 2021
    Messages : 33
    Points : 6
    Points
    6
    Par défaut Parcourir un string et prélever tous les mots entre guillemets
    Bonsoir bonsoir j’espère que ça va pour vous , ça va chez moi en tout cas.
    J’ai besoin d’un rapide ‘conseil’ s’il vous plait 🙏

    J’aimerais qu’un court code parcoure une chaine de caractères, et que chaque fois qu’il trouve un guillemet « il se mette à enregistrer ce qu’il se trouve jusqu’à la fermeture », et qu'il soit capable de me trouver toutes les fois où cela arrive dans la chaine.
    En fait une boucle parcourt déjà une liste avec une longue chaine de caractères dans chaque position.

    J’ai beau me creuser la tête je ne trouve pas de bonne idée claire qui résoudrait le problème, enfin le mini script est presque terminé j’ai essayé maintes façons et je suis le plus proche du résultat avec celui-là :
    (J’aimerais avoir les coordonnées de chaque début et fin de note(« ») dans la chaine).

    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
        ik=0
        i=1
        c=0
        mos= 'bciajejf bcjfue 72274 "hey nathan" fjeuz   ieala "i av heya"'
     
        for fed in mos:
            if fed == '"':
                print(fed,ik)
                b=ik
                aa=b #aa start of ";b location of "
                #bb is end of "
                while mos[aa+i] != '"':
                    c+=1
                    i+=1 #i , is used to go from "opening to "closing
                if mos[b+i] == '"':
                    print("word between ",aa," and ",ik+i)
            ik+=1

    Il y a des choses non cohérentes vraiment mais c’est à cause des essais que j’ai fait, et du reste du code de mon programme. En espérant que vous serrez de bon et clair conseil merci beaucoup !

  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
    Salut
    Citation Envoyé par NatHsn26 Voir le message
    J’aimerais qu’un court code parcoure une chaine de caractères, et que chaque fois qu’il trouve un guillemet « il se mette à enregistrer ce qu’il se trouve jusqu’à la fermeture », et qu'il soit capable de me trouver toutes les fois où cela arrive dans la chaine.
    Un simple automate à êtat. Quand tu trouves un guillemet tu positionnes un flag selon que tu es dans ou hors zone et quand le flag est positionné, tu enregistres les caractères lus
    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
    mos='bciajejf bcjfue 72274 "hey nathan" fjeuz   ieala "i av heya"'
     
    flag=False
    enreg=[]
    for c in mos:
    	if c == '"':
    		if flag: enreg.append(mot)
    		else: mot=""
    		flag=not flag
    		continue
    	# if
    	if flag: mot+=c
    # for
    print(enreg, len(enreg))

    Après je pense qu'une regex pourrait le faire mais suis pas assez calé en regex pour trouver ça.

    Citation Envoyé par NatHsn26 Voir le message
    Il y a des choses non cohérentes vraiment
    Oui, ce while dans le for. Pour traiter un truc on part sur une boucle, c'est la base.
    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
    Futur Membre du Club
    Homme Profil pro
    Rien en rapport pour le moment
    Inscrit en
    Mars 2021
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Rien en rapport pour le moment

    Informations forums :
    Inscription : Mars 2021
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    Salut sve@r.
    Merci beaucoup de ta réponse,cela marche comme il faut c’est cool .
    J’avoue que je comprend pas comment le code que tu ma fournit fonctionne malgré que j’avais à l’époque étudié les flag ,je sait plus ce que c’est j’ai zappé l’affaire , j’étudierai au fur et à mesure que j’ai besoin j’ai téléchargé quelques applis pour étudier python qui ont l’air pas mal.
    Je vais faire une pose la quand meme ca me donne mal au cerveau de réfléchir ahha je continuerai plus tard🌪c’est que je vais devoir la optimiser mon code avec des Class et tout ca pour qu’il soit plus joli et compréhensible.Pour ce qui est des regex j’en ai jamais entendu parlé je crois je me renseignerais sur le sujet.

    Je peut reposer une question ici ? Sinon je vais ouvrir un autre thread np pour qu’il soit plus visible mais peut etre pourra tu me conseiller facilement j’espère.

    Je suis encore sur mon logiciel de traduction ,et je fait enfaite passer toute les permutation d’un mot donné dans une class qui va traduire, les mot ,un après l’autre , de la liste des permutation. C’est une class «*Class xvs(Threading.Thread):*» que j’ai créer, cependant quand j’execute une boucle hors de la class qui vas passer a la class chacune des permutation possible une après l’autre , la boucle attend que le code du thread ai fini de s’exécuter à 100% pour envoyer une seconde valeur . Je ne gagne donc pas de temp comparé à un script de traduction basique qui traduit un par un les mot.
    Je pense faire un fichier avec le thread fait pour traduire 30 mot par 30 mot par exemple, et l’executer autant de fois que il le faut via le script principale ,et qu’il aille marquer le résultat dans un fichier texte que je récupèrerai depuis le main script une fois que le Nb de permut est atteint.Je pense que ca soit pas être trop compliqué à faire je ne sait pas ,je me re pencherai dessus bientôt.Mais bon peut être que il y a façon simple d’executer et renvoyer dans l’ordre les résultats sans que il y ai un délai d’attente c’est ce qui m’intéresse .Peut-être que j’ai mal utilisé la façon dont marche le Threading c’est ce que je vient de me demander c’est quand même étrange me semble t’il que la boucle qui parcourt la liste via son nombre d’éléments attende à chaque fois que le mot soit traduit et retranscrit. Le plus gros soucis est que cela bloque dans tout les cas , avec ou sans thread ,à 300 traduction environ

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Points : 119
    Points
    119
    Par défaut
    Hello,

    Je propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mos='bciajejf bcjfue 72274 "hey nathan" fjeuz   ieala "i av heya"' # This is the sample string
    lis = mos.split('"') # Get all parts of the string separated by '"'
    if mos[0]!='"' : lis.pop(0) # If first character is not '"' then first element of the list has no '"' on his left
    print(lis[0:-1:2]) # Get all even elements inside the list (from 0 to -1, with step 2)

  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
    Salut,

    Si le but est de récupérer les index de... .find fait çà très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> mots = 'bciajejf bcjfue 72274 "hey nathan" fjeuz   ieala "i av heya"'
    >>> mots.find('"')
    22
    "L'astuce" pour trouver les suivants sera de lui passer par ou commencer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> mots.find('"',23)
    33
    Pour construire la liste, on emballe cela dans une boucle...

    Après, sûr qu'avec les expressions régulières çà fait plus "pro":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> [ m.span() for m in re.finditer('".*?"', mots) ]
    [(22, 34), (49, 60)]
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    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 NatHsn26 Voir le message
    J’avoue que je comprend pas comment le code que tu ma fournit fonctionne
    Je teste le guillemet et si je le trouve soit c'est que j'entre dans la zone soit que j'en sors. Si j'entre je mémorise les caractères et si j'en sors je récupère le mot mémorisé.

    Citation Envoyé par NatHsn26 Voir le message
    Jmalgré que j’avais à l’époque étudié les flag ,je sait plus ce que c’est j’ai zappé l’affaire
    "étudié" ??? C'est juste une variable qui vaut vrai/faux qui permet d'indiquer un état dedans/dehors ou levé/baissé. Ca vaut même pas une demi-page dans un bouquin d'algo !!!
    Et pour ton pb de thread, autre pb=autre topic. D'autant plus que sans code... Mais bon, travailler sur x*y trucs ou générer x processus qui chacun vont travailler sur y trucs c'est généralement assez kif-kif. Parce que derrière tout ça, il n'y a qu'un seul ordi qui bosse. Enfin bon ça peut se réfléchir et se discuter...

    Citation Envoyé par charliemtx Voir le message
    Je propose ceci :
    Pas mal. Un split sur les guillemets et ne récupérer que les éléments pairs

    Citation Envoyé par wiztricks Voir le message
    Après, sûr qu'avec les expressions régulières çà fait plus "pro"
    Je savais bien qu'on allait y venir
    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]

  7. #7
    Invité
    Invité(e)
    Par défaut
    Et sans regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> mots = 'bciajejf bcjfue 72274 "hey nathan" fjeuz   ieala "i av heya"'
    >>> [[id for id, l in enumerate(mots) if l == '"'][x:x+2] for x in range(0, mots.count('"'), 2)]
    [[22, 33], [49, 59]]
    @wiztricks
    Eh eh tes indexes de fin sont faux !

  8. #8
    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
    Citation Envoyé par LeNarvalo Voir le message
    Eh eh tes indexes de fin sont faux !
    Ils ne sont pas faux, ils sont juste "pythoniques".

    Pour extraire le bout de chaine de caractères qui va du premier '"' au second:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> mots = 'bciajejf bcjfue 72274 "hey nathan" fjeuz   ieala "i av heya"'
    >>> mots[22:34]
    '"hey nathan"'
    >>>
    ce qui est cohérent avec des indices d'intervalles pour slices, range,...

    Après on peut vouloir en faire autre chose et les retravailler. Ici, je me suis contenté de montrer ce qu'on peut faire avec .find et des regex et pas autre chose.

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

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ils ne sont pas faux, ils sont juste "pythoniques".
    Mouai, c'est fou comme les gens qui ont créé regex étaient tordus quand même !

    Pièce jointe 594930

  10. #10
    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,

    Citation Envoyé par LeNarvalo Voir le message
    Mouai, c'est fou comme les gens qui ont créé regex étaient tordus quand même !
    On n'a pas choisi "par hasard" des intervalles semi-ouverts [m, n[ et que l'indice du premier item d'un tableau soit 0... plutôt que 1.

    Ces choix ne sont pas spécifiques à Python.

    Si çà vous intéresse, il doit y avoir des articles sur l'histoire de l'informatique qui racontent le pourquoi, les alternatives,...

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

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    pour le sujet initial : Parcourir un string et prélever tous les mots entre guillemets


    Avec un regex tout est tellement plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import re
    mos = 'bciajejf bcjfue 72274 "hey nathan" fjeuz   ieala "i av heya"'
    print(re.findall('"([^"]*)"', mos))
    résultat :
    >>> ['hey nathan', 'i av heya']

    findall : on cherche toutes les occurrences
    explication du motif "([^"]*)" : on capture tous les caractères qui se trouvent entre des guillemets et qui ne soient pas des guillemets.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  12. #12
    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 jurassic pork Voir le message
    findall : on cherche toutes les occurrences
    explication du motif "([^"]*)" : on capture tous les caractères qui se trouvent entre des guillemets et qui ne soient pas des guillemets.
    Ben oui, voilà
    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]

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Rien en rapport pour le moment
    Inscrit en
    Mars 2021
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Rien en rapport pour le moment

    Informations forums :
    Inscription : Mars 2021
    Messages : 33
    Points : 6
    Points
    6
    Par défaut
    Salut tout le monde ,désolé pour l’absence j’étais très occupé.
    Merci pour toute l’aide en tout cas je vois que il y a beaucoup de choix ahah , houla je suis impressionné par le dernier @jurassic_pork je m’attendais pas à ca 😁meme si je comprend pas le paramètre fourni je m’attarderais sur ca a l’avenir.
    Sinon sve@r ta raison mdr on peut pas appeler ça étudié mais vus que je suivais pas mal de cours en meme temp appelons ca comme ca 💡
    Ty 📚🦹*♀️

Discussions similaires

  1. [RegEx] Trouver les mots entre guillemets
    Par naynay dans le forum Langage
    Réponses: 6
    Dernier message: 20/07/2009, 16h43
  2. [RegEx] Trouver tous les "/mot" dans une chaîne
    Par micatmidog dans le forum Langage
    Réponses: 7
    Dernier message: 31/03/2006, 12h07
  3. suppression de tous les mots de moins de 3 caracteres
    Par HurtMarley dans le forum Langage
    Réponses: 3
    Dernier message: 14/02/2006, 01h20
  4. Parcourir un répertoire et récupérer tous les fichiers
    Par Sniper94-2 dans le forum Windows
    Réponses: 6
    Dernier message: 08/09/2005, 01h23
  5. [String] comment virer tous les espaces vides ?
    Par Alec6 dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2004, 14h27

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