extraire chaine de caractere
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

extraire chaine de caractere



  1. #1
    neo62950

    extraire chaine de caractere


    ------

    Bonjour à tous,

    Je debute en language python et je bloque sur un exercice:

    Donner une définition de la fonction extrait qui, étant donné une chaîne de caractères s et
    deux caractères car1 et car2, renvoie la portion de la chaîne s comprise entre la première
    occurrence de car1 (exclue) et la première occurrence de car2 qui suit (exclue). Si car1
    n’apparaît pas, la chaîne renvoyée doit être vide ; si car1 apparaît mais pas car2, la chaîne
    renvoyée doit aller jusqu’au bout de s.
    Par exemple :
    >>> extrait(’abracadabra’, ’b’, ’d’)
    ’raca’
    >>> extrait(’abracadabra’, ’c’, ’b’)
    ’ada’
    >>> extrait(’abracadabra’, ’a’, ’b’)
    ’’
    >>> extrait(’abracadabra’, ’a’, ’a’)
    ’br’
    >>> extrait(’abracadabra’, ’a’, ’e’)
    ’bracadabra’
    >>> extrait(’abracadabra’, ’e’, ’a’)
    ’’

    Franchement je seche, j'ai commencé comme suit:

    def extrait(s : str, car1 : str, car2 : str) -> str:
    r : str = ''
    i : str
    for i in s:
    if i == car1:

    je sais ca n'est pas grand chose, j'ai essayer plusieurs chose mais je n'arrive pas a terminer. je ne trouve pas comment dire au programme de garder ce qui se trouve entre car1 et car2

    Merci à tous

    -----

  2. #2
    Ernum

    Re : extraire chaine de caractere

    Salut,

    tu devrais jeter un œil ici: https://forums.futura-sciences.com/p...ves-forum.html

  3. #3
    neo62950

    Re : extraire chaine de caractere

    desolé je n'ai pas fait attention
    je n'arrete pas de modifier le code mais en vain

    Code:
    def extrait(s : str, car1 : str, car2 : str) -> str:
        r : str = ''
        e : str
        i=0
        j=0
        for e in s:
            if e == car1:
                while s[j] != "car2":
                       r = r + e
                       j = j + 1
        return r
    ca me renvoie une chaine vide a chaque test

    Merci à tous

  4. #4
    pm42

    Re : extraire chaine de caractere

    Ton algo est faux. Tu devrais essayer de l'exécuter en pas à pas au debugger.
    Parce que quelque soit la position de car1, tu vas commencer à remplir ta chaine à partir de j = 0 et la remplir uniquement avec des e donc des car1.

  5. A voir en vidéo sur Futura
  6. #5
    neo62950

    Re : extraire chaine de caractere

    Citation Envoyé par pm42 Voir le message
    Ton algo est faux. Tu devrais essayer de l'exécuter en pas à pas au debugger.
    Parce que quelque soit la position de car1, tu vas commencer à remplir ta chaine à partir de j = 0 et la remplir uniquement avec des e donc des car1.
    Merci pour ta reponse,

    Je ne me suis jamais servis d'un debugger (je ne sais meme pas ce que c'est), je sais que mon algo est faux, je n'arrive mme pas a faire commencer le retour apres car1 (car1 doit etre exclu).
    Mais si deja j'arriver a lui faire prendre de car1 a car2 ca serait deja un bon debut mais je ne trouve pas comment faire

  7. #6
    pm42

    Re : extraire chaine de caractere

    Apprendre à utiliser un débugger est sans doute la chose la plus importante à faire quand on débute justement.
    Parce qu'on a du mal à voir ce que fait le code et que ça permet de le suivre.

    Il y a plein de tutoriaux qui expliquent si tu utilises PyCharm, Spyder ou d'autres IDE.

    Dans ton cas, tu as une boucle for qui ne te permet pas de connaitre l'indice où tu as trouvé car1.
    Tu devrais la remplacer par une boucle while qui incrémente un indice i jusqu'à ce que tu trouves car1.

    Et là, tu ne continues pas ta boucle.

    Tu en commences une autre qui démarre à i+1 et rempli une chaine tant qu'elle n'a pas trouvé car2, ce que faisait déjà plus ou moins ta boucle while.

  8. #7
    Ernum

    Re : extraire chaine de caractere

    Sinon,
    l'indentation est incohérente après while...
    "i" est défini mais pas utilisé.
    Dernière modification par Ernum ; 23/10/2022 à 15h16. Motif: téléscopage avec pm42

  9. #8
    neo62950

    Re : extraire chaine de caractere

    Citation Envoyé par pm42 Voir le message
    Apprendre à utiliser un débugger est sans doute la chose la plus importante à faire quand on débute justement.
    Parce qu'on a du mal à voir ce que fait le code et que ça permet de le suivre.
    moi je suis le cours que le prof m'a donné, a aucun moment il nous parle de debugguer
    Citation Envoyé par pm42 Voir le message
    Dans ton cas, tu as une boucle for qui ne te permet pas de connaitre l'indice où tu as trouvé car1.
    Tu devrais la remplacer par une boucle while qui incrémente un indice i jusqu'à ce que tu trouves car1.

    Et là, tu ne continues pas ta boucle.

    Tu en commences une autre qui démarre à i+1 et rempli une chaine tant qu'elle n'a pas trouvé car2, ce que faisait déjà plus ou moins ta boucle while.
    si j'essaie de mettre :
    Code:
    while s[i] != car1:
          if s[i] == car1:
              return i
          else:
                i = i + 1
    return None
    juste pour qu'il me trouve deja la premiere occurence de car 1, mais ca ne me renvoie aucun resultat

  10. #9
    neo62950

    Re : extraire chaine de caractere

    petite modif desole pour le double post mais je ne peux plus editer


    si j'essaie de mettre :
    Code:
    while i < len(s):
          if s[i] == car1:
              return i
          else:
                i = i + 1
    return None
    juste pour qu'il me trouve deja la premiere occurence de car 1, la il me trouve la premiere occurence moi je veux qu'il commence a me prendre a partir du caractere suivant

  11. #10
    pm42

    Re : extraire chaine de caractere

    Normal. Ta boucle while s'arrête quand elle a trouvé car1 et tu ne passes jamais dans ton if qui est redondant.

    Pour le reste, les profs ne parlent en effet pas du debugger rapidement et c'est une erreur monumentale.

  12. #11
    neo62950

    Re : extraire chaine de caractere

    quand je met
    Code:
    def extrait(s : str, car1 : str, car2 : str) -> str:
    
        r : str = ''
        p : str = ''
        q : str = ''
        i : int = 0
        j : int = 0
        while i < len(s):
            if s[i] == car1:
                r = r + s[i]
            else:
                i = i + 1
        return r
    au moins il me trouve le bon caractere, est ce que je suis sur la bonne voie?

  13. #12
    pm42

    Re : extraire chaine de caractere

    C'est mieux mais ta boucle parcours tout la chaîne.

    Tu dois en faire 2 : la 1ere trouve car1.

    La 2nd remplit jusqu'à car2.

  14. #13
    neo62950

    Re : extraire chaine de caractere

    Citation Envoyé par pm42 Voir le message
    C'est mieux mais ta boucle parcours tout la chaîne.

    Tu dois en faire 2 : la 1ere trouve car1.

    La 2nd remplit jusqu'à car2.
    c'est ce que j'essaie de faire mais je sais pas ou mettre la seconde boucle, je dois me planter dans l'identation parce que rien ne marche, je ne peut pas mettre une seconde boucle aavant la derniere ligne mais avec le meme identation que la premiere

  15. #14
    neo62950

    Re : extraire chaine de caractere

    j'ai trouvé:
    Code:
        while i < len(s):
            if s[i] == car1:
                r = r + s[i]
                while j < len(s):
                    if s[j] == car2:
                        p = p + s[j]
                        return p
                    else:
                        j = j + 1
            else:
                i = i + 1
        return 'fail'
    la il m'affiche car 2, je ne voit pas comment faire pour que la deuxieme boucle remplisse jusque car2

  16. #15
    neo62950

    Re : extraire chaine de caractere

    j'ai trouvé enfin

    Code:
    def extrait(s : str, car1 : str, car2 : str) -> str:
    
        r : int = 0
        p : int = 0
        q : int = 0
        i : int = 0
        j : int = 0
        while i < len(s):
            if s[i] == car1:
                r = r + (i+ 1)
                while j < len(s):
                    if s[j] == car2:
                        p = p + j
                        return s[r:p]
                    else:
                        j = j + 1
            else:
                i = i + 1
        return ''
    merci pour votre aide

  17. #16
    umfred

    Re : extraire chaine de caractere

    pas tout à fait, si tu fais extrait('abracadabra','c','r') tu devrais avoir 'adab', or ta fonction renvoie '' car tu pars du début pour le 2nd caractère, et non pas du 1er caractère.
    A mon avis pas besoin d'imbriquer les 2 while, tu fais trop de boucles (ou il faut ajouter des break)
    (Je suppose aussi qu'on ne peut pas utiliser les fonctions de str, comme index)

  18. #17
    polo974

    Re : extraire chaine de caractere

    pour rire:
    Code:
    def extrait(s,x,y): return x.join(s.split(x)[1:]).split(y)[0]
    sinon, pour sortir "au milieu" d'une boucle (for ou while), il y a break qui rompt la boucle.
    de plus, il y a un truc sympa en python: les boucles for et while peuvent avoir un else dans lequel on passe en final SI on n'a pas rompu la boucle par un break.
    Jusqu'ici tout va bien...

  19. #18
    pm42

    Re : extraire chaine de caractere

    Citation Envoyé par polo974 Voir le message
    sinon, pour sortir "au milieu" d'une boucle (for ou while), il y a break qui rompt la boucle.
    de plus, il y a un truc sympa en python: les boucles for et while peuvent avoir un else dans lequel on passe en final SI on n'a pas rompu la boucle par un break.
    Oui mais pour un débutant qui intrique des boucles qui devraient être consécutives et a du mal à initialiser les indices aux bonnes valeurs c'est peut être un poil compliqué.

  20. #19
    polo974

    Re : extraire chaine de caractere

    Citation Envoyé par pm42 Voir le message
    Oui mais pour un débutant qui intrique des boucles qui devraient être consécutives et a du mal à initialiser les indices aux bonnes valeurs c'est peut être un poil compliqué.
    L'intrication n'est pas une faute en soi, elle permet de passer de la 1ère recherche à l'a seconde sans avoir à gérer les 2 cas de sortie de la première boucle (trouvé, pas trouvé).

    Le else en fin de boucle permet justement de gérer la différence entre une sortie anticipée (par un break) ou l'épuisement de la boucle, je trouve cette possibilité trop peu mise en avant. Ici, justement, elle a tout son sens si on désire chaîner et non imbriquer les boucles.
    Jusqu'ici tout va bien...

  21. #20
    oxycryo

    Re : extraire chaine de caractere

    bon, puisque tu as trouvé ta solution
    j'enposte une possible, j'ai pas éssayé

    Code:
    aa="abracadbra"
    cur="";
    ee="";
    out=[];
    for x,i in enumerate(aa)
        cur+=i;
        if ee=0;
          if i==s0: cur=""; ee=1
        if ee=1;
          if i==s1; out+=[cur]; ee=0
    
       return out

  22. #21
    pm42

    Re : extraire chaine de caractere

    Citation Envoyé par oxycryo Voir le message
    j'enposte une possible, j'ai pas éssayé

    Code:
        if ee=0;
    = à la place de ==, ee initialisé plus haut à "" alors que c'est un entier utilisé comme un booléen, l'enumerate qui ne sert à rien vu qu'on n'utilise jamais x mais qu'il est mélangé avec i...
    La moindre des choses est quand même d'éviter de poster du code bourré d'erreurs.

  23. #22
    umfred

    Re : extraire chaine de caractere

    Citation Envoyé par oxycryo Voir le message
    bon, puisque tu as trouvé ta solution
    j'enposte une possible, j'ai pas éssayé

    Code:
    aa="abracadbra"
    cur="";
    ee="";
    out=[];
    for x,i in enumerate(aa)
        cur+=i;
        if ee=0;
          if i==s0: cur=""; ee=1
        if ee=1;
          if i==s1; out+=[cur]; ee=0
    
       return out
    Ton code n'est pas vraiment une fonction .... l'indentation du return est mauvaise, tu initialises ee en tant que chaine par une chaine vide, et tu la compares à un entier (0 ou 1), donc pourquoi ne pas dire que c'est un booléen (True/False ou un entier dès le début, histoire de cohérence); s0 et s1 sortent d'où?
    Bref tu devrais tester un petit peu plus ton code

  24. #23
    oxycryo

    Re : extraire chaine de caractere

    le tester tout cour, mon cher Umfred...
    mais tu n'as pas tort, il manque plein de truc, mais j'ai la conscience tranquille... l'ayant fait "sur le pouce"

    donc... ce qui devrait-être mieux

    y'a p'tet des cas non pris en charge... mais

    Code:
    def test0(aa,c0,c1):
        cur=""
        ee=0
        out=[]
        for i in aa:
            cur+=i
            if ee==0:
              if i==c0:
                cur=""; ee=1
            if ee==1:
              if i==c1:
                out+=[cur[:-1]]; ee=0
        out+=[cur]
        return out

  25. #24
    pm42

    Re : extraire chaine de caractere

    Si j'essaie avec comme arguments "foobar", "o", "b", ça me renvoie ['o', 'obar'] ce qui n'a rien à voir avec ce qui est demandé.

    Pour le reste, les nommages sont catastrophiques, l'algorithme est inefficace, inutilement compliqué et vu le résultat, faux à plusieurs niveaux.

Discussions similaires

  1. [Programmation] PIC C18 chaine de caractère et I2C
    Par Leo_Isere dans le forum Électronique
    Réponses: 2
    Dernier message: 19/03/2017, 22h01
  2. [C] chaine de caractère.
    Par invite38d9e885 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 26/12/2015, 11h05
  3. [C] Concaténer chaine de caractère + caractère
    Par invite48ca7510 dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 26/01/2013, 11h43
  4. chaîne de caractère
    Par invite9c4bf030 dans le forum Programmation et langages, Algorithmique
    Réponses: 6
    Dernier message: 02/04/2012, 19h30
  5. Chaine de caractère C++
    Par invitee5fedd72 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 06/03/2008, 20h29