131

複数行にまたがるテキストと照合するときに、Python 正規表現を機能させるのに少し苦労しています。テキストの例は ('\n' は改行です)

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 にしたいと思います。

興味のある方は、タンパク質を構成するアミノ酸の配列であると思われます.

4

6 に答える 6

139

これを試して:

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

あなたの最大の問題は、アンカー^$アンカーが改行と一致することを期待していることだと思いますが、そうではありません。複数行モードでは、改行の^直後位置と$一致し、改行の直前の位置と一致します。

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

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

ところで、ここでは DOTALL 修飾子を使用したくありません。ドットが改行以外のすべてに一致するという事実に依存しています。

于 2009-02-25T20:06:01.973 に答える
5

各ファイルにアミノ酸のシーケンスが 1 つしかない場合、正規表現はまったく使用しません。このようなもの:

def read_amino_acid_sequence(path):
    with open(path) as sequence_file:
        title = sequence_file.readline() # read 1st line
        aminoacid_sequence = sequence_file.read() # read the rest

    # some cleanup, if necessary
    title = title.strip() # remove trailing white spaces and newline
    aminoacid_sequence = aminoacid_sequence.replace(" ","").replace("\n","")
    return title, aminoacid_sequence
于 2009-02-25T20:59:59.067 に答える
4

探す:

^>([^\n\r]+)[\n\r]([A-Z\n\r]+)

\1 = some_varying_text

\2 = すべて大文字の行

編集(これが機能することの証明):

text = """> some_Varying_TEXT

DSJFKDAFJKDAFJDSAKFJADSFLKDLAFKDSAF
GATACAACATAGGATACA
GGGGGAAAAAAAATTTTTTTTT
CCCCAAAA

> some_Varying_TEXT2

DJASDFHKJFHKSDHF
HHASGDFTERYTERE
GAGAGAGAGAG
PPPPPAAAAAAAAAAAAAAAP
"""

import re

regex = re.compile(r'^>([^\n\r]+)[\n\r]([A-Z\n\r]+)', re.MULTILINE)
matches = [m.groups() for m in regex.finditer(text)]

for m in matches:
    print 'Name: %s\nSequence:%s' % (m[0], m[1])
于 2009-02-25T19:11:53.943 に答える
1

私の好み。

lineIter= iter(aFile)
for line in lineIter:
    if line.startswith( ">" ):
         someVaryingText= line
         break
assert len( lineIter.next().strip() ) == 0
acids= []
for line in lineIter:
    if len(line.strip()) == 0:
        break
    acids.append( line )

この時点で、文字列としての someVaryingText と、文字列のリストとしての酸があります。"".join( acids )単一の文字列を作成することができます。

これは、複数行の正規表現よりもイライラが少ない (そしてより柔軟である) と思います。

于 2009-02-25T20:58:28.837 に答える