ホームページ >バックエンド開発 >Python チュートリアル >Python の複数行のマッチング パターンを理解する

Python の複数行のマッチング パターンを理解する

Guanhui
Guanhui転載
2020-07-24 17:22:333012ブラウズ

Python の複数行のマッチング パターンを理解する

質問

正規表現を使用して大きなテキスト ブロックと一致させようとしていますが、次のことが必要です。複数行にわたって一致します。

解決策

この問題は通常、ドット (.) を使用して任意の文字と一致するが、ドット (.) は改行と一致できないことを忘れている場合に発生します。たとえば、C 区切りのコメントを一致させたいとします。

>>> 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/>

この問題を解決するには、パターン文字列を変更して改行のサポートを追加します。例:

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

このパターンでは、(?:.|\n) は非キャプチャ グループを指定します (つまり、マッチングにのみ使用され、個別にキャプチャしたり番号を付けることはできないグループを定義します)。 )。

Discussion

re.compile() この関数は、 re.DOTALL というフラグ パラメータを受け取ります。ここで役に立ちます。これにより、正規表現内の . が改行を含む任意の文字と一致するようになります。例:

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

re.DOTALL タグ パラメータを使用する単純な場合はうまく機能しますが、パターンが非常に複雑である場合、または複数のパターンを組み合わせて文字列トークンを構築する場合 (セクションの詳細な説明) 2.18). 現時点では、このマーク パラメーターを使用するといくつかの問題が発生する可能性があります。選択できる場合は、追加のマーカー パラメーターを必要とせずに適切に機能するように、独自の正規表現パターンを定義することをお勧めします。

推奨チュートリアル: 「Python チュートリアル

以上がPython の複数行のマッチング パターンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。