Faire correspondre des blocs multilignes à l'aide d'expressions régulières
Vous pouvez rencontrer des difficultés lors de la mise en correspondance d'un texte qui s'étend sur plusieurs lignes à l'aide des expressions régulières de Python. Prenons l'exemple de texte suivant :
some Varying TEXT DSJFKDAFJKDAFJDSAKFJADSFLKDLAFKDSAF [more of the above, ending with a newline] [yep, there is a variable number of lines here] (repeat the above a few hundred times).
L'objectif est de capturer deux composants :
Plusieurs approches ont été tentées sans succès :
<code class="python">re.compile(r"^>(\w+)$$(\n[.$]+)^$", re.MULTILINE) # Capture both parts re.compile(r"([^>][\w\s]+)$", re.MULTILINE|re.DOTALL) # Just textlines</code>
Pour résoudre ce problème, utilisez l'expression régulière suivante :
<code class="python">re.compile(r"^(.+)\n((?:\n.+)+)", re.MULTILINE)</code>
Gardez à l'esprit que les ancres "^" et "$" ne correspondent pas aux sauts de ligne. Par conséquent, en mode multiligne, "^" suit une nouvelle ligne et "$" précède une nouvelle ligne.
De plus, soyez attentif aux différents formats de nouvelle ligne. Pour le texte pouvant contenir des sauts de ligne, des retours chariot ou les deux, utilisez cette expression régulière plus inclusive :
<code class="python">re.compile(r"^(.+)(?:\n|\r\n?)((?:(?:\n|\r\n?).+)+)", re.MULTILINE)</code>
Le modificateur DOTALL n'est pas nécessaire ici car le point exclut déjà les nouvelles lignes.
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!