Recherche et remplacement de texte en Python

Recherche et remplacement de texte sensible à la casse

Python vous propose la méthode replace() de la classe str. Elle vous permet de remplacer une sous-chaîne simple – une chaîne de caractères brute – dans une chaîne de caractères. Donc si vous voulez rechercher et remplacer un motif de texte dans une chaîne de caractères. Par exemple :

>>> texte = 'oui, non, mais oui, mais non, mais non'
>>> texte.replace('oui', 'ouiiii')
'ouiiii, non, mais ouiiii, mais non, mais non'

>>>

 

Pour des motifs de texte plus compliqués, utilisez les fonctions/méthodes sub() du module re. A titre d’exemple, supposons que vous vouliez réécrire les dates du formulaire “27/08/2017” en “2017-08-27”. Voici un exemple qui démontre comment accomplir cette tâche.

>>> texte = "Aujour'hui le 08/27/2017. PyCon commence à 12/27/2017."
>>> import re
>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', texte)
"Aujour'hui le 2017-08-27. PyCon commence à 2017-12-27."

>>>

 

Le premier argument de la fonction sub() est le motif à chercher et le deuxième argument est le motif de remplacement. Les chiffres précédés d’une barre oblique inverse tels que \3 désignent les numéros de groupe de capture dans le motif.

Si vous voulez effectuer des substitutions répétées du même motif, pensez à le compiler en premier pour obtenir de meilleures performances. Par exemple:

>>> import re
>>> texte = "Aujour'hui le 08/27/2017. PyCon commence à 12/27/2017."
>>> motif = re.compile(r'(\d+)/(\d+)/(\d+)')
>>> motif.sub(r'\3-\1-\2', texte)
"Aujour'hui le 2017-08-27. PyCon commence à 2017-12-27."

>>>

 

Pour effectuer des substitutions plus complexes, il est possible de spécifier une fonction de substitution à la place. Par exemple :

>>> texte = "Aujour'hui le 08/27/2017. PyCon commence à 12/27/2017."

>>> from calendar import month_abbr
>>> def changer_date(m):
...	mois_nom = month_abbr[int(m.group(1))]
...	return '{} {} {}'.format(m.group(2), mois_nom, m.group(3))
...
>>> motif.sub(changer_date, texte)
"Aujour'hui le 27 Aug 2017. PyCon commence à 27 Dec 2017."

>>>

 

L’argument du principale de la fonction de substitution est un objet match, retourné par match() ou find(). Pour extraire des parties spécifiques de l’objet match, utilisez la méthode group(). La fonction doit renvoyer le texte de remplacement.

Si vous voulez savoir combien de substitutions ont été faites en plus du texte de remplacement, utilisez la méthode re.subn(). Par exemple:

>>> nouveautexte, n = motif.subn(r'\3-\1-\2', texte)

>>> nouveautexte
"Aujour'hui le 2017-08-27. PyCon commence à 2017-12-27."

>>> n
2

>>>

 

Il n’y a pas beaucoup de fonctions à utiliser concernant la recherche et le remplacement d’expressions régulières que la méthode sub() déja illustrée. La partie la plus délicate est de spécifier le motif d’expression régulière.

Recherche et remplacement de texte non sensible à la casse

Si vous avez besoin de rechercher et éventuellement remplacer du texte d’une manière insensible à la casse, c’est possible sur Python.

En effet, vous pouvez importer le module re et fournir l’indicateur re.IGNORECASE aux diverses méthodes de recherche et remplacement pour effectuer des opérations de texte non sensibles à la casse. Par exemple:

>>> texte = 'PYTHON MAJUSCULE, python miniscule, Python contenant des majuscule et des miniscules'

>>> re.findall('python', texte, flags=re.IGNORECASE)
['PYTHON', 'python', 'Python']

>>> re.sub('python', 'java', texte, flags=re.IGNORECASE)
'java MAJUSCULE, java miniscule, java contenant des majuscule et des miniscules'

>>>

 

L’exemple suivant montre une limitation selon laquelle le remplacement du texte ne correspondra pas à la casse du texte trouvé. Si vous avez besoin de corriger ce problème, vous devrez peut-être utiliser une fonction de support, comme suit:

def apparierCasse(mot):
   def remplacer(m):
      texte = m.group()
      if texte.isupper():
         return mot.upper()
      elif texte.islower():
         return mot.lower()
      elif texte[0].isupper():
         return mot.capitalize()
      else:
         return mot
   return remplacer

 

Voici un exemple d’utilisation de cette de la fonction apparierCasse().

>>> texte = 'PYTHON MAJUSCULE, python miniscule, Python contenant des majuscule et des miniscules'
>>> re.sub('python', apparierCasse('java'), texte, flags=re.IGNORECASE)
'JAVA MAJUSCULE, java miniscule, Java contenant des majuscule et des miniscules'

>>> 

Dans un cas simple, il suffit de fournir le re.IGNORECASE pour effectuer une recherche insensible à la casse. Cependant, sachez que cela peut ne pas être suffisant pour certains types d’appariement Unicode. On va développer ça dans de prochains articles.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here