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 Text
group(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修飾子は使用しないでください。ドットがすべての文字に一致するという事実に依存しています。を除外する改行。