Forum Programmation.python Python, substitution et regex

Posté par  (site web personnel) .
Étiquettes :
1
5
jan.
2012

Salut,

Je voudrais faire une substitution avec des chaines qui contiennent '\'. Je me heurte à un soucis : visiblement le '\' d'échapemment est supprimé à chaque fois que la chaine '<char>' est interprétable en ascii.

Par exemple :

$ ipython
Python 2.7.2+ (default, Dec 18 2011, 00:33:35)
In [1]: import re

In [2]: re.sub('pattern', '\\test', 'replace the pattern by \\test')
Out[2]: 'replace the \test by \\test'

In [3]: re.sub('pattern', '\\lest', 'replace the pattern by \\lest')
Out[3]: 'replace the \\lest by \\lest'

In [4]: re.sub('pattern', '\\nest', 'replace the pattern by \\nest')
Out[4]: 'replace the \nest by \\nest'

Normalement, dans tous les cas, j'aimerais ne pas voir disparaître mon '\' d'échappement. Qu'en pensez vous ? Bug ou feature ? Avez vous déjà rencontré ça ? Comment surmonter ce détail ?

  • # Bon, en fait c'est documenté ...

    Posté par  (site web personnel) . Évalué à 2.

    http://docs.python.org/library/re.html#re.sub

    If the pattern isn’t found, string is returned unchanged. repl can be a string or a function; if it is a string, any backslash escapes in it are processed. That is, \n is converted to a single newline character, \r is converted to a carriage return, and so forth. Unknown escapes such as \j are left alone.

    Adhérer à l'April, ça vous tente ?

  • # raw string

    Posté par  (site web personnel) . Évalué à 2.

    Il faut utiliser des raw strings

    In [1]: import re
        
    In [2]: re.sub('pattern', r'\\test', 'replace the pattern by \\test')
    Out[2]: 'replace the \\test by \\test'
        
    In [3]: re.sub('pattern', r'\\lest', 'replace the pattern by \\lest')
    Out[3]: 'replace the \\lest by \\lest'
        
    In [4]: re.sub('pattern', r'\\nest', 'replace the pattern by \\nest')
     Out[4]: 'replace the \\nest by \\nest'
    
    

    http://docs.python.org/reference/lexical_analysis.html#string-literals

    Matthieu Gautier|irc:starmad

    • [^] # Re: raw string

      Posté par  (site web personnel) . Évalué à 2. Dernière modification le 05 janvier 2012 à 15:30.

      Merci, mais je ne sais pas utiliser des raw strings lorsque mon motif de remplacement est le contenu d'un fichier.

      Adhérer à l'April, ça vous tente ?

      • [^] # Re: raw string

        Posté par  (site web personnel) . Évalué à 3.

        Ha ben faut donner le problème en entier aussi :)

        C'est un peu bourrin, mais ça marche :

        In [19]: re.sub('pattern', re.sub(r'\\', r'\\\\', "\\test") , 'replace the pattern by \\test')
        Out[19]: 'replace the \\test by \\test'
        
        In [20]: re.sub('pattern', re.sub(r'\\', r'\\\\', "\\nest") , 'replace the pattern by \\test')
        Out[20]: 'replace the \\nest by \\test'
        
        In [21]: re.sub('pattern', re.sub(r'\\', r'\\\\', "\\lest") , 'replace the pattern by \\test')
        Out[21]: 'replace the \\lest by \\test'
        
        

        tu peux aussi convertir ta chaine en raw string :
        http://code.activestate.com/recipes/65211-convert-a-string-into-a-raw-string/

        Par contre je sais pas vraiment quelle est la différence en terme de résultat entre les deux méthode...

        Matthieu Gautier|irc:starmad

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.