9

基本的に、入力ファイルは次のようになります。

>U51677 ヒト非ヒストンクロマチンタンパク質 HMG1 (HMG1) 遺伝子、完全

       cds. #some records don't have this line (see below)

       Length = 2575

(一部テキスト)

>U51677 ヒト非ヒストンクロマチンタンパク質 HMG1 (HMG1) 遺伝子、完全

       Length = 2575

(一部テキスト)

(等...)

>で始まる行と長さの数字を抽出するためにこれを書きました

import re
regex = re.compile("^(>.*)\r\n.*Length\s=\s(\d+)", re.MULTILINE)
match = regex.findall(sample_blast.read())

print match[0]

長さの行が>行の次の行である場合、レコードを抽出するのにうまく機能します。

次に、余分な行があるかどうかに関係なく、レコードを一致させる必要がある re.DOTALL (.*Length) を試しました。

regex = re.compile("^(>.*)\r\n.*(?:\r\n*.?)Length\s=\s(\d+)", re.MULTILINE|re.DOTALL)

しかし、うまくいきません。パイプの代わりに re.MULTILINE と re.DOTALL を試しましたが、それでもうまくいきません。

したがって、問題は、レコードに一致する正規表現を作成し、レコードに余分な行があるかどうかに関係なく、目的のグループを返す方法です。誰かがこれを re.VERBOSE でも表示できるといいですね。長い投稿で申し訳ありません。事前に助けてくれてありがとう。:)

4

2 に答える 2

4

あなたの問題はおそらくあなたの使用です\r\n。代わりに、次のみを使用してみてください\n

>>> x = """
... >U51677 ヒト非ヒストンクロマチンタンパク質 HMG1 (HMG1) 遺伝子、完全
...
... CD。# 一部のレコードにはこの行がありません (以下を参照)
...
... 長さ = 2575
... (テキスト)
...
... >U51677 ヒト非ヒストンクロマチンタンパク質 HMG1 (HMG1) 遺伝子、完全
...
... 長さ = 2575
... (テキスト)
...
... (など...)
... """
>>> re.search("^(>.*)\n.*(?:\n*.?)長さ\s=\s(\d+)", x, re.MULTILINE|re.DOTALL)
<_sre.SRE_Match オブジェクト 0x10c937e00>
>>> _.group(2)
「2575」

さらに、あなたの最初.*は貪欲すぎます。代わりに、次を使用してみてください: ^(>.*?)$.*?Length\s=\s(\d+):

>>> re.findall("^(>.*?)$.*?長さ\s=\s(\d+)", x, re.MULTILINE|re.DOTALL)
[('>U51677 ヒト非ヒストンクロマチンタンパク質 HMG1 (HMG1) 遺伝子、完全'、'2575')、('>U51677 ヒト非ヒストンクロマチンタンパク質 HMG1 (HMG1) 遺伝子、完全'、'2575')]
于 2012-10-28T16:59:31.690 に答える
0

この正規表現を試してください:

"^(>[^\r\n]*).*?Length\s=\s(\d+)"

両方のオプションを設定します (パイプ表記を使用)。

>最初のキャプチャ グループは、 (オペレーティング システムに関係なく)後の最初の改行までのすべてに一致します。次に、は最初に遭遇.*?するまで任意の文字に一致します。あとは最初の試みと同じです。 Length

あなたの以前の試みの問題は、あなたが使用する.*which は何にでも一致し、同時に貪欲であることです(したがって、次のLength = 2575.

于 2012-10-28T17:01:53.503 に答える