ホームページ  >  記事  >  バックエンド開発  >  正規表現を使用して複数行のテキスト ブロックをキャプチャするにはどうすればよいですか?

正規表現を使用して複数行のテキスト ブロックをキャプチャするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-25 06:05:02777ブラウズ

How to Capture Multiline Text Blocks with Regular Expressions?

複数行のテキスト ブロックを一致させるための正規表現

複数行にまたがるテキストを一致させると、正規表現の構築に課題が生じる可能性があります。次のテキスト例を考えてみましょう。

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)

目標は、2 つのコンポーネントをキャプチャすることです。「一部の可変テキスト」部分と、空の行を除く大文字テキストの後続のすべての行です。

間違ったアプローチ:

この問題を解決するためのいくつかの間違ったアプローチは次のとおりです:

  • 改行を一致させるために ^ アンカーと $ アンカーを使用する。複数行モードでは、^ は改行に続く位置に一致し、$ は改行に続く位置に一致します。
  • DOTALL 修飾子を使用してすべてに一致しますが、ドット (.) は改行以外のすべてに一致するため、これは不要です。

解決策:

次の正規表現は、目的のコンポーネントを正しく取得します:

^(.+)\n((?:\n.+)+)

そのコンポーネントの内訳は次のとおりです:

  • ^ は行の先頭に一致します。
  • (. ) は「一部の可変テキスト」部分をグループ 1 にキャプチャします。
  • n は改行文字に一致します。
  • ( (?:n. ) ) は、大文字テキストの後続のすべての行をグループ 2 にキャプチャします。 ?: 非キャプチャ グループ構造により、これらの行が個別のグループとしてキャプチャされなくなります。
  • 繰り返し演算子により、少なくとも 1 つのグループがキャプチャされます。大文字のテキストの行が存在します。

使用法:

Python でこの正規表現を使用するには、次のコードを使用できます:

<code class="python">import re

pattern = re.compile(r"^(.+)\n((?:\n.+)+)", re.MULTILINE)</code>

その後、match() メソッドを使用して文字列内で一致するものを見つけることができます:

<code class="python">match = pattern.match(text)
if match:
    text1 = match.group(1)
    text2 = match.group(2)</code>

以上が正規表現を使用して複数行のテキスト ブロックをキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。