Écrire une expression régulière pour des motifs de texte multilignes

Vous essayez d’apparier un bloc de texte à l’aide d’une expression régulière, mais vous avez besoin que la correspondance couvre plusieurs lignes.

Ce problème se pose généralement dans les motifs de texte qui utilisent le caractère point (.) pour apparier n’importe quel caractère mais oublient de tenir compte du fait qu’il ne correspond pas aux nouvelles lignes.

Par exemple, supposons que vous essayez de faire correspondre des commentaires de style C:

>>> commentaire = re.compile(r'/\*(.*?)\*/')
>>> texte1 = '/* voici un commentaire */'
>>> texte2 = "/* voici un
... commentaire multi-lignes */
... "
>>>
>>> commentaire.findall(texte1)
[' voici un commentaire ']
>>> commentaire.findall(texte2)
[]
>>>

 

Pour résoudre le problème, vous pouvez ajouter la prise en charge des caractères retour à la ligne. Par exemple:

>>> texte2 = '/* voici un commentaire multi-lignes */'

>>> import re

>>> commentaire = re.compile(r'/\*((?:.|\n)*?)\*/')

>>> commentaire.findall(texte2)
[' voici un commentaire multi-lignes ']

>>>

 

Dans ce motif, (? :.|\n) spécifie un groupe non capturé (c’est-à-dire qu’il définit un groupe aux fins de l’appariement, mais ce groupe n’est pas capturé séparément ou numéroté).

La fonction re.compile() accepte un flag, re.DOTALL, qui est utile ici. Il fait correspondre le point (.) dans une expression régulière à tous les caractères, y compris les caractères retour à la ligne. Par exemple:

>>> commentaire = re.compile(r'/\*(.*?)\*/', re.DOTALL)

>>> commentaire.findall(texte2)
[' voici un commentaire multi-lignes ']

>>>

 

L’utilisation de l’indicateur re.DOTALL fonctionne bien pour les cas simples, mais peut être problématique si vous allez travailler avec des motifs extrêmement compliqués ou un mélange d’expressions régulières séparées qui ont été combinées ensemble dans le but de créer des jetons.

Si vous avez le choix, il est généralement préférable de définir votre motif d’expression régulière pour qu’il fonctionne correctement sans avoir besoin d’options supplémentaires.

 

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here