ホームページ >バックエンド開発 >Python チュートリアル >Python の複数行のマッチング パターンを理解する
質問
正規表現を使用して大きなテキスト ブロックと一致させようとしていますが、次のことが必要です。複数行にわたって一致します。
解決策
この問題は通常、ドット (.) を使用して任意の文字と一致するが、ドット (.) は改行と一致できないことを忘れている場合に発生します。たとえば、C 区切りのコメントを一致させたいとします。
>>> 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/>
この問題を解決するには、パターン文字列を変更して改行のサポートを追加します。例:
>>> comment = re.compile(r'/\*((?:.|\n)*?)\*/')<br/>>>> comment.findall(text2)<br/>[' this is a\n multiline comment ']<br/>>>><br/>
このパターンでは、(?:.|\n) は非キャプチャ グループを指定します (つまり、マッチングにのみ使用され、個別にキャプチャしたり番号を付けることはできないグループを定義します)。 )。
Discussion
re.compile()
この関数は、 re.DOTALL
というフラグ パラメータを受け取ります。ここで役に立ちます。これにより、正規表現内の . が改行を含む任意の文字と一致するようになります。例:
>>> comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)<br/>>>> comment.findall(text2)<br/>[' this is a\n multiline comment ']<br/>
re.DOTALL
タグ パラメータを使用する単純な場合はうまく機能しますが、パターンが非常に複雑である場合、または複数のパターンを組み合わせて文字列トークンを構築する場合 (セクションの詳細な説明) 2.18). 現時点では、このマーク パラメーターを使用するといくつかの問題が発生する可能性があります。選択できる場合は、追加のマーカー パラメーターを必要とせずに適切に機能するように、独自の正規表現パターンを定義することをお勧めします。
推奨チュートリアル: 「Python チュートリアル 」
以上がPython の複数行のマッチング パターンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。