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'/\*(.*?)\*/')<br/>>>> text1 = '/* this is a comment */'<br/>>>> text2 = '''/* this is a<br/>... multiline comment */<br/>... '''<br/>>>><br/>>>> comment.findall(text1)<br/>[' this is a comment ']<br/>>>> comment.findall(text2)<br/>[]<br/>>>><br/>
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'/\*((?:.|\n)*?)\*/')<br/>>>> comment.findall(text2)<br/>[' this is a\n multiline comment ']<br/>>>><br/>
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'/\*(.*?)\*/', re.DOTALL)<br/>>>> comment.findall(text2)<br/>[' this is a\n multiline comment ']<br/>
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!