Regular expression matching a multiline block of text Ask Question

Regular expression matching a multiline block of text Ask Question

I'm having a bit of trouble getting a Python regex to work when matching against text that spans multiple lines. The example text is (\n is a newline)

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).

I'd like to capture two things:

  • the some Varying TEXT part
  • all lines of uppercase text that come two lines below it in one capture (I can strip out the newline characters later).

I've tried a few approaches:

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 行はキャッチできないようです。空の行に遭遇するまで、line1+line2+line3+etcとmatch.group(1)したいです。some Varying Textgroup(2)

興味のある人のために説明すると、これはタンパク質を構成するアミノ酸の配列のことです。

ベストアンサー1

これを試して:

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

^最大の問題は、と$アンカーが改行と一致することを期待しているが、そうではないということだと思います。複数行モードでは、^すぐに位置に一致します。続く改行して$すぐに位置に一致する前の改行。

また、改行は、ラインフィード ( \n)、キャリッジリターン ( \r)、またはキャリッジリターン+ラインフィード ( \r\n) で構成される場合があることにも注意してください。ターゲットテキストでラインフィードのみが使用されているかどうか不明な場合は、次のより包括的な正規表現を使用する必要があります。

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

ところで、ここではDOTALL修飾子は使用しないでください。ドットがすべての文字に一致するという事実に依存しています。を除外する改行。

おすすめ記事