1

だから私がやろうとしているのは、文字列内のシーケンス「ATG」を見つけ、そこから「TAA」、「TAG」、または「TGA」のいずれかが見つかるまで、3単位で文字列に沿って移動する関数を持っていることです。 '(ATG-xxx-xxx-TAA | TAG | TGA)

これを行うために、私はこのコード行を書きました(ここfdnaで入力シーケンスはです)

ORF_sequences = re.findall(r'ATG(?:...)*?(?:TAA|TAG|TGA)',fdna)

次に、3つの要件を追加したいと思いました。

  1. 全長は30でなければなりません
  2. ATGの2箇所前に、AまたはGのいずれかが検出される必要があります(A | GxxATGxxx)
  3. ATGの次の場所はG(ATGGxx)である必要があります

この部分を実行するために、コードを次のように変更しました。

ORF_sequence_finder = re.findall(r'[AG]..ATGG..(?:...){7,}?(?:TAA|TAG|TGA)',fdna)

これらすべての制限を設定する代わりに、要件1(30文字以上)を設定してから、要件2(A | GxxATGxxx)または要件3(ATGGxx)、あるいはその両方を設定する必要があります。

上記の行を2つに分割してリストに追加すると、順序が狂って繰り返しが発生します。

さまざまなケースの例を次に示します。

sequence1 = 'AGCCATGTGGGGGGGGGGGGGGGGGGGGGGGGGGGGGTGAAAA'
sequence2 = 'ATCCATGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGTAG'
sequence3 = 'AGCCATGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGTAG'    
sequence4 = 'ATGGGGTGA'

sequence1 = 'A**G**CC*ATG*TGGGGGGGGGGGGGGGGGGGGGGGGGGGGG*TGA*AAA'

sequence1要件2(A | GxxATGxxx)に従い、長さが30以上であるため、基準によって受け入れられます。

sequence2 = 'ATCC*ATG***G**GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG*TAG*

sequence2要件3(ATGGxx)に従い、長さが30以上であるため、受け入れられます。

sequence3 = 'A**G**CC*ATG***G**GGGGGGGGGGGGGGGGGGGGGGGGGGGGG*TGA*AAA'

sequence3要件2と3の両方を満たし、30文字以上であるため、受け入れられます。

sequence4 = 'ATGGGGTGA'

sequence430以上ではないため、要件2または要件3に準拠していないため、受け入れられません。

したがって、基本的には、要件1を満たしながら、要件2および/または要件3(または両方)のいずれかに従うシーケンスを受け入れるようにします。

重複を追加せずに(両方が発生した場合)、これを分割するにはどうすればよいですか?

4

1 に答える 1

1

可能な[AG]..ものを長さの要件に含める必要がある場合は、次を使用できます。

r'(?x) (?: [AG].. ATG | ATG G.. )  (?:...){7,}? (?:TAA|TAG|TGA)'

または、試合に含めたくない場合は[AG]..、ルックアラウンドを使用できます。

r'(?x) ATG (?: (?<=[AG].. ATG) | (?=G) ) (?:...){8,}? (?:TAA|TAG|TGA)'
于 2013-03-14T05:10:37.677 に答える