Remplacement de chaîne en Python

 

On a souvent besoin de remplacer une chaîne par une autre. En Python, il y a plusieurs moyen d'y parvenir.

Le plus simple est d'utiliser la méthode 'replace':

>>> s = 'une chaine'
>>> s.replace(' ',' autre ')
'une autre chaine'

C'est facile et rapide, mais limité.

L'autre moyen est d'utiliser le module re Il permets un remplacement souple et puissant. Bien sûr, c'est plus lent. Voici la correspondance avec l'exemple précédent:

>>> import re
>>> s = 'une chaine'
>>> re.sub(r'\s',' autre ',s)
'une autre chaine'

L'avantage, c'est que l'on est pas obligé de remplacer une chaîne par une autre. L'élément de remplacement peut être une fonction. Toujours pour l'exemple précédent:

>>> def sub(g):
...     return ' autre '
...
>>> s = 'une chaine'
>>> re.sub(r'\s',sub,s)
'une autre chaine'

Jusque là, on ne voit pas trop l'intérêt, je suis d'accord. L'intérêt, c'est que le module re est puissant. Voici un exemple plus complexe:

>>> html = """
... j'ai un <a href="/une_page">lien relatif</a>
... et un <a href="http://afpy.org/">lien absolu</a>. Pas cool
... """
>>>
>>> def sub(g):
...     start = g.group('start')
...     url = g.group('url')
...     if url.startswith('/'):
...         url = 'http://afpy.org%s' % url
...     end = g.group('end')
...     return start + url + end
...
>>> re.sub(r'(?P<start>.*href=")(?P<url>\S+)(?P<end>".*)',sub,html)
'\nj\'ai un <a href="http://afpy.org/une_page">lien relatif</a>\net un <a href="http://afpy.org/">lien absolu</a>. Pas cool\n'

Ça devient tout de suite plus intéressant. Non ?

Je m'arrêterais la. Ce tutoriel n'as pas pour vocation de vous apprendre les regexp. Si vous voulez en savoir plus, consulter la doc Python sur le module re.

A noter tout de même un soft sympa pour tester vos regexp: Kodos.