1. ホーム
  2. python

[解決済み] 複数行のテキストブロックにマッチする正規表現

2022-03-03 07:58:38

質問

Pythonの正規表現で、複数行にまたがるテキストに対してマッチングする際に、少し問題があります。例題のテキストは次のとおりです('nothing'は改行)。

some Varying TEXT\n
\n
DSJFKDAFJKDAFJDSAKFJADSFLKDLAFKDSAF\n
[more of the above, ending with a newline]\n
[yep, there is a variable number of lines here]\n
\n
(repeat the above a few hundred times).

some_Varying_TEXT」部分と、その2行下にある大文字のテキストをすべて1回のキャプチャで取り込みたいのです(改行文字は後で取り除くことができます)。 いくつかのアプローチで試してみました。

re.compile(r"^>(\w+)$$([.$]+)^$", re.MULTILINE) # try to capture both parts
re.compile(r"(^[^>][\w\s]+)$", re.MULTILINE|re.DOTALL) # just textlines

と多くのバリエーションがありますが、うまくいきません。最後のものは、テキストの行を1つずつマッチングさせるようですが、これは私が本当に望んでいるものではありません。最初の部分は問題なくキャッチできるのですが、4~5行の大文字のテキストをキャッチできないようです。 私は match.group(1) が some_Varying_Text で、group(2) が空行に出会うまで line1+line2+line3+etc であって欲しいと思っています。

もし興味があれば、タンパク質を構成するアミノ酸の配列であることを想定しています。

解き方は?

これを試してみてください。

re.compile(r"^(.+)\n((?:\n.+)+)", re.MULTILINE)

一番問題なのは、このように ^$ アンカーが改行と一致するように設定されていますが、一致しません。 マルチラインモードでは ^ はすぐに 以下 改行と $ は、その直後の位置に一致します。 直前の を改行する。

また、改行にはラインフィード( \n )、キャリッジリターン( \r )、またはキャリッジリターン+改行( \r\n ). 対象となるテキストが改行のみを使用することが確実でない場合、このより包括的なバージョンの正規表現を使用する必要があります。

re.compile(r"^(.+)(?:\n|\r\n?)((?:(?:\n|\r\n?).+)+)", re.MULTILINE)

ところで、ここでは DOTALL 修飾子は使わないでください。ドットがすべてにマッチするという事実に頼っていることになります。 ただし の改行が必要です。