Comprendre les modèles de correspondance multiligne Python

Guanhui
Libérer: 2020-07-24 17:22:33
avant
3003 Les gens l'ont consulté

Comprendre les modèles de correspondance multiligne Python

Question

Vous essayez d'utiliser une expression régulière pour faire correspondre un gros bloc de texte et vous avez besoin Faites correspondre plusieurs lignes.

Solution

Ce problème se produit généralement lorsque vous utilisez un point (.) pour correspondre à n'importe quel caractère, mais oubliez que le point (.) ne peut pas correspondre à une nouvelle ligne conforme aux faits . Par exemple, disons que vous souhaitez essayer de faire correspondre le commentaire C-split :

>>> comment = re.compile(r&#39;/\*(.*?)\*/&#39;)<br/>>>> text1 = &#39;/* this is a comment */&#39;<br/>>>> text2 = &#39;&#39;&#39;/* this is a<br/>... multiline comment */<br/>... &#39;&#39;&#39;<br/>>>><br/>>>> comment.findall(text1)<br/>[&#39; this is a comment &#39;]<br/>>>> comment.findall(text2)<br/>[]<br/>>>><br/>
Copier après la connexion

Pour résoudre ce problème, vous pouvez modifier la chaîne de modèle pour ajouter la prise en charge des nouvelles lignes. Par exemple :

>>> comment = re.compile(r&#39;/\*((?:.|\n)*?)\*/&#39;)<br/>>>> comment.findall(text2)<br/>[&#39; this is a\n multiline comment &#39;]<br/>>>><br/>
Copier après la connexion

Dans ce modèle, (?:.|n) spécifie un groupe non capturant (c'est-à-dire qu'il définit un groupe qui est uniquement utilisé pour la correspondance et ne peut pas être capturé ou numéroté individuellement) .

Discussion

re.compile() La fonction accepte un paramètre flag appelé re.DOTALL , ce qui est très utile ici. Il permet à .dans les expressions régulières de correspondre à n'importe quel caractère, y compris les nouvelles lignes. Par exemple :

>>> comment = re.compile(r&#39;/\*(.*?)\*/&#39;, re.DOTALL)<br/>>>> comment.findall(text2)<br/>[&#39; this is a\n multiline comment &#39;]<br/>
Copier après la connexion

Utiliser re.DOTALL pour marquer les paramètres fonctionne bien pour les cas simples, mais si le modèle est très complexe ou si plusieurs modèles sont combinés pour construire un jeton de chaîne (décrit en détail dans la section 2.18), certains des problèmes peuvent survenir lors de l'utilisation de ce paramètre de marque. Si vous avez le choix, il est préférable de définir votre propre modèle d'expression régulière afin qu'il fonctionne correctement sans avoir besoin de paramètres de marqueur supplémentaires.

Tutoriel recommandé : "Tutoriel Python"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:jb51.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal