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 :

chaine python - caractère d'échappement - comparaison [Python 3.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 303
    Par défaut chaine python - caractère d'échappement - comparaison
    Bonjour à tous,

    Le problème suivant me semble élémentaire et pourtant je cale.
    Si je regarde les 2 chaines suivantes :
    a= "Lorsqu'un fruit est éliminé"
    b= "Lorsqu\'un fruit est éliminé"
    Pourquoi b affiche t'il les caractères d'échappement et pas a ?
    Comment puis-je forcer a à faire de même ? En fait, j'ai besoin d'effectuer des comparaisons sur ces chaines et pour cela il faut qu'elles soient d'un format identique et que le format affiche également les retours à la ligne.
    J'ai bien essayé les fonctions str() et repr() mais sans résultat.

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2018
    Messages : 15
    Par défaut
    Bonjour

    Je ne suis pas certain de comprendre le pb car dans la variable a il n'y a pas de caractère d'échappement.

    Je tente quand même quelque chose : as-tu essayé avec un 'r' devant les chaines ? b= r"Lorsqu\'un fruit est éliminé"

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 685
    Par défaut
    comment ont été formée tes chaines, c'est peut-être la la bonne question à se poser, car si je rentre ces 2 chaines dans mon interpréteur python telles que tu les présentes, les 2 chaines sont identiques (a==b => true)

    Edit: tu peux tenter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c= bytes(b,'ansi').decode('unicode_escape')
    (adapter l'encoding dans bytes)

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 303
    Par défaut
    Bonjour,

    Pour illustrer et surtout comprendre mon problème, je viens d'écrire un script simplifié :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    from odfdo import Document, Paragraph
     
    def creer_document(texte_para1,texte_para2):
        print('-------   creer_document()   -----------------')
     
        doc=Document()
     
        para1=Paragraph(texte_para1)
        doc.body.append(para1)
     
        para2=Paragraph(texte_para2)
        doc.body.append(para2)
     
        return doc
     
     
    def cherche(doc,parent):
        print("--------   cherche()   ----------------")
        para=doc.body.get_paragraph(content=parent)
     
        # repr_paragraphe
        repr_paragraphe=repr(para.get_formatted_text()) ## Ceci me permet d'intégrer les retours à la ligne dans ma chaine
        print('~~~~ repr_paragraphe : ',repr_paragraphe)
     
     
    if __name__ == '__main__':
        texte_para1="""Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre,"""
     
        texte_para2="""la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre, afin qu'il soit plus facile à récolter, à protéger ou à asperger.
    Une alternative au fastidieux "éclaircissage des fruits" """
     
        # Dans quel para se trouve le texte suivant :
        parent1="toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre"
        parent2="la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre"
     
     
        doc=creer_document(texte_para1,texte_para2)
     
        cherche(doc,parent1)
        cherche(doc,parent2) ##  parent2 inclut des guillemets et pour cette raison cherche() imprime également les échappements devant les apostrophes
    qui donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -------   creer_document()   -----------------
    --------   cherche()   ----------------
    ~~~~ repr_paragraphe :  "Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre,\n\n"
    --------   cherche()   ----------------
    ~~~~ repr_paragraphe :  'la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l\'arbre, afin qu\'il soit plus facile à récolter, à protéger ou à asperger.\nUne alternative au fastidieux "éclaircissage des fruits"\n\n'
    Puisque avec texte2, les échappements sont nécessaires et automatiquement inclus, je voudrais forcer leur utilisation avec texte.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 303
    Par défaut
    Le problème étant identifié, je devrais m'en sortir de cette manière :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    from odfdo import Document, Paragraph
     
    def creer_document(texte_para1,texte_para2):
        print('-------   creer_document()   -----------------')
     
        doc=Document()
     
        para1=Paragraph(texte_para1)
        doc.body.append(para1)
     
        para2=Paragraph(texte_para2)
        doc.body.append(para2)
     
        return doc
     
     
    def cherche(doc,parent):
        print("--------   cherche()   ----------------")
        para=doc.body.get_paragraph(content=parent)
     
        # repr_paragraphe
        repr_paragraphe=repr(para.get_formatted_text()) ## Ceci me permet d'intégrer les retours à la ligne dans ma chaine
        print('~~~~ repr_paragraphe : ',repr_paragraphe)
     
        if r"\'" in repr_paragraphe:
            repr_paragraphe=repr_paragraphe.replace(r"\'",r"'")
            print("~~~~ repr_paragraphe SANS LES ECHAPPEMENTS : ",repr_paragraphe)
     
     
    if __name__ == '__main__':
        texte_para1="""Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre,"""
     
        texte_para2="""la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre, afin qu'il soit plus facile à récolter, à protéger ou à asperger.
    Une alternative au fastidieux "éclaircissage des fruits" """
     
        # Dans quel para se trouve le texte suivant :
        parent1="toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre"
        parent2="la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre"
     
     
        doc=creer_document(texte_para1,texte_para2)
     
        cherche(doc,parent1)
        cherche(doc,parent2) ##  parent2 inclut des guillemets et pour cette raison cherche imprime également les échappements devants les apostrophes
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -------   creer_document()   -----------------
    --------   cherche()   ----------------
    ~~~~ repr_paragraphe :  "Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre,\n\n"
    --------   cherche()   ----------------
    ~~~~ repr_paragraphe :  'la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l\'arbre, afin qu\'il soit plus facile à récolter, à protéger ou à asperger.\nUne alternative au fastidieux "éclaircissage des fruits"\n\n'
    ~~~~ repr_paragraphe SANS LES ECHAPPEMENTS :  'la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre, afin qu'il soit plus facile à récolter, à protéger ou à asperger.\nUne alternative au fastidieux "éclaircissage des fruits"\n\n'
    Je ne comprends pas comment c'est possible que la chaine soit dans ma console toujours délimitée par des guillemets simples identiques avec les apostrophes utilisés mais je confirme,ça marche.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 685
    Par défaut
    je ne vois pas de problème ou ne comprends pas le problème, test chaines sont identiques (au retour à la ligne près) si tu ne stockes par leur représentation.
    Si tuu écris tes textes ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        texte_para1="""Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l\'arbre,"""
     
        texte_para2="""la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l\'arbre, afin qu\'il soit plus facile à récolter, à protéger ou à asperger.
    Une alternative au fastidieux "éclaircissage des fruits" """
     
        # Dans quel para se trouve le texte suivant :
        parent1="toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre"
        parent2="la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre"
    ça ne changera strictement rien au résultat, ça te retournera bien tes 2 paragraphes

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 303
    Par défaut
    Pour aller plus loin :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    from odfdo import Document, Paragraph
    
    def creer_document(texte_para1,texte_para2):
        print('-------   creer_document()   -----------------')
    
        doc=Document()
    
        para1=Paragraph(texte_para1)
        doc.body.append(para1)
    
        para2=Paragraph(texte_para2)
        doc.body.append(para2)
    
        return doc
    
    
    def cherche(doc,parent):
        print("--------   cherche()   ----------------")
        para=doc.body.get_paragraph(content=parent)
    
        # repr_paragraphe
        repr_paragraphe=repr(para.get_formatted_text()) ## Ceci me permet d'intégrer les retours à la ligne dans ma chaine
        print('~~~~ repr_paragraphe : ',repr_paragraphe)
    
        index_parent=repr_paragraphe.find(parent)
        print('--- index de : {} -->  '.format(parent),index_parent) ## --> ## find() retourne -1 si la chaine n'a pas été trouvée.
    
        if r"\'" in repr_paragraphe:
            repr_paragraphe=repr_paragraphe.replace(r"\'",r"'")
            print("~~~~ repr_paragraphe SANS LES ECHAPPEMENTS : ",repr_paragraphe)
            index_parent=repr_paragraphe.find(parent)
            print('--- index de : {} --> '.format(parent),index_parent)
    
    
    if __name__ == '__main__':
        texte_para1="""Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre,"""
    
        texte_para2="""la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre, afin qu'il soit plus facile à récolter, à protéger ou à asperger.
    Une alternative au fastidieux "éclaircissage des fruits" """
    
        # Dans quel para se trouve le texte suivant :
        parent1="la forme de l'arbre"
        parent2="réduire les dimensions de l'arbre"
    
    
        doc=creer_document(texte_para1,texte_para2)
    
        cherche(doc,parent1)
        cherche(doc,parent2) ##  parent2 inclut des guillemets et pour cette raison cherche imprime également les échappements devants les apostrophes
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -------   creer_document()   -----------------
    --------   cherche()   ----------------
    ~~~~ repr_paragraphe :  "Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre,\n\n"
    --- index de : la forme de l'arbre -->   112
    --------   cherche()   ----------------
    ~~~~ repr_paragraphe :  'la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l\'arbre, afin qu\'il soit plus facile à récolter, à protéger ou à asperger.\nUne alternative au fastidieux "éclaircissage des fruits"\n\n'
    --- index de : réduire les dimensions de l'arbre -->   -1
    ~~~~ repr_paragraphe SANS LES ECHAPPEMENTS :  'la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre, afin qu'il soit plus facile à récolter, à protéger ou à asperger.\nUne alternative au fastidieux "éclaircissage des fruits"\n\n'
    --- index de : réduire les dimensions de l'arbre -->  68

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 685
    Par défaut
    Comme je l'ai évoqué, pourquoi travailler sur la chaine retournée par repr(), c'est inutile, travaille directement sur le retour des get_formatted_text()

    tu te compliques la vie, à mon avis.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    from odfdo import Document, Paragraph
     
    def creer_document(texte_para1,texte_para2):
        print('-------   creer_document()   -----------------')
     
        doc=Document()
     
        para1=Paragraph(texte_para1)
        doc.body.append(para1)
     
        para2=Paragraph(texte_para2)
        doc.body.append(para2)
     
        return doc
     
     
    def cherche(doc,parent):
        print("--------   cherche()   ----------------")
        para=doc.body.get_paragraph(content=parent)
     
        # repr_paragraphe
        r_para=para.get_formatted_text()
        repr_paragraphe=repr(para.get_formatted_text()) ## Ceci me permet d'intégrer les retours à la ligne dans ma chaine
        print('~~~~ repr_paragraphe : ',repr_paragraphe)
        print('~~~~ no_repr_paragraphe : ',r_para)
     
     
        index_parent=repr_paragraphe.find(parent)
        print('--- (with repr) index de : {} -->  '.format(parent),index_parent) ## --> ## find() retourne -1 si la chaine n'a pas été trouvée.
        index_p=r_para.find(parent)
        print('--- (no repr)  index de : {} -->  '.format(parent),index_p) ## --> ## find() retourne -1 si la chaine n'a pas été trouvée.
     
        if r"\'" in repr_paragraphe:
            repr_paragraphe=repr_paragraphe.replace(r"\'",r"'")
            print("~~~~ repr_paragraphe SANS LES ECHAPPEMENTS : ",repr_paragraphe)
            index_parent=repr_paragraphe.find(parent)
            print('--- index de : {} --> '.format(parent),index_parent)
     
     
    if __name__ == '__main__':
        texte_para1="""Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre,"""
     
        texte_para2="""la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre, afin qu'il soit plus facile à récolter, à protéger ou à asperger.
    Une alternative au fastidieux "éclaircissage des fruits" """
     
        # Dans quel para se trouve le texte suivant :
        parent1="la forme de l'arbre"
        parent2="réduire les dimensions de l'arbre"
     
     
        doc=creer_document(texte_para1,texte_para2)
     
        cherche(doc,parent1)
        cherche(doc,parent2) ##  parent2 inclut des guillemets et pour cette raison cherche imprime également les échappements devants les apostrophes
    Résultat:
    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
    -------   creer_document()   -----------------
    --------   cherche()   ----------------
    ~~~~ repr_paragraphe :  "Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre,\n\n"
    ~~~~ no_repr_paragraphe :  Une fois que tous le bois abîmé ou gênant et toutes les branches concurrentes ont été supprimés pour préserver la forme de l'arbre,
     
     
    --- (with repr) index de : la forme de l'arbre -->   112
    --- (no repr)  index de : la forme de l'arbre -->   111
    --------   cherche()   ----------------
    ~~~~ repr_paragraphe :  'la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l\'arbre, afin qu\'il soit plus facile à récolter, à protéger ou à asperger.\nUne alternative au fastidieux "éclaircissage des fruits"\n\n'
    ~~~~ no_repr_paragraphe :  la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre, afin qu'il soit plus facile à récolter, à protéger ou à asperger.
    Une alternative au fastidieux "éclaircissage des fruits"
     
     
    --- (with repr) index de : réduire les dimensions de l'arbre -->   -1
    --- (no repr)  index de : réduire les dimensions de l'arbre -->   67
    ~~~~ repr_paragraphe SANS LES ECHAPPEMENTS :  'la troisième étapes est de renouveler le bois de fructification et réduire les dimensions de l'arbre, afin qu'il soit plus facile à récolter, à protéger ou à asperger.\nUne alternative au fastidieux "éclaircissage des fruits"\n\n'
    --- index de : réduire les dimensions de l'arbre -->  68
    La différence de 1, vient du fait que tu as un guillemet en tête de ta chaine en plus

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 303
    Par défaut
    J'utilise repr() car j'ai besoin que les "\n" soient intégrés dans la chaine.

    Le but de tout ceci est de placer des spans comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    para.set_span(style=nom_tag,offset=debut,length=lg)
    Si ceci semble facile, certains retours à la ligne font que ceci ne fonctionne pas aussi aisément. D'où l'intérêt de récupérer les "\n" dans ma chaine. Il est ensuite tout à fait possible de calculer debut.

    # span offset become complex after inserting <CR> and <TAB> in a text
    Cette manière de pocéder (recherche du paragraphe -> recherche d'un 'parent' -> recherche du mot concerné) peut paraître lourde mais je confirme : ça marche et les "\n" ne sont plus source d'erreurs.

    En tout cas merci pour merci pour tes suggestions.

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

Discussions similaires

  1. [Python 2.7] Problème comparaison entre float
    Par pipodug dans le forum Général Python
    Réponses: 8
    Dernier message: 16/01/2016, 13h42
  2. Ajouter un caractere à une chaine python
    Par rosef dans le forum Général Python
    Réponses: 4
    Dernier message: 18/09/2013, 19h56
  3. sous chaine python
    Par ekremyilmaz dans le forum Général Python
    Réponses: 19
    Dernier message: 13/11/2008, 18h35
  4. Réponses: 5
    Dernier message: 06/10/2003, 18h49
  5. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 23h41

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