だから私がやろうとしているのは、文字列内のシーケンス「ATG」を見つけ、そこから「TAA」、「TAG」、または「TGA」のいずれかが見つかるまで、3単位で文字列に沿って移動する関数を持っていることです。 '(ATG-xxx-xxx-TAA | TAG | TGA)
これを行うために、私はこのコード行を書きました(ここfdna
で入力シーケンスはです)
ORF_sequences = re.findall(r'ATG(?:...)*?(?:TAA|TAG|TGA)',fdna)
次に、3つの要件を追加したいと思いました。
- 全長は30でなければなりません
- ATGの2箇所前に、AまたはGのいずれかが検出される必要があります(A | GxxATGxxx)
- 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'
sequence4
30以上ではないため、要件2または要件3に準拠していないため、受け入れられません。
したがって、基本的には、要件1を満たしながら、要件2および/または要件3(または両方)のいずれかに従うシーケンスを受け入れるようにします。
重複を追加せずに(両方が発生した場合)、これを分割するにはどうすればよいですか?