0
ORF_sequences = re.findall(r'ATG(?:...){9,}?(?:TAA|TAG|TGA)',sequence)  #thanks to @Martin Pieters and @nneonneo

A|G の任意のインスタンスを検索し、その後に 2 文字が続き、ATG の後に 3 単位で読み取ったときに TAA|TAG|TGA が続くコード行があります。A|G-xx-ATG の場合にのみ機能します-xxx-TAA|TAG|TGAが30要素以上

基準を追加したい

ATG の後に G が必要です

A|G-xx-ATG-Gxx-xxx-TAA|TGA|TAG #少なくとも 30 要素の長さの 例: GCCATGGGGTTTTTTTTTTTTTTTTTTTTTTTTTGA ^ が機能します

GCATGAGGTTTTTTTTTTTTTTTTTTTTTTTTTGA
^ would not work because it is an (A|G) followed by only one value (not 2) before the ATG and there is not a G following the A|G-xx-ATG

これが理にかなっていることを願っています

私は試した

ORF_sequences = re.findall(r'ATGG(?:...){9,}?(?:TAA|TAG|TGA)',sequence)

ATGGの最後のG以降はウィンドウサイズ3を使っていたようですが

基本的に、最初に出現するコードが A|G-xx-ATG で、2 番目に出現するコードが (G-xx) であるコードが必要です。

4

2 に答える 2

1

の文字グループを使用すると簡単になります[AG]。2 つの「フリー」文字をグループ化する必要はありません。

 ORF_sequences2 = re.findall(r'[AG]..ATG(?:...)*?(?:TAA|TAG|TGA)',fdna)

または、次をグループ化する必要がありますA|G

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

最初のフォームを例に適用する:

>>> re.findall(r'[AG]..ATG(?:...)*?(?:TAA|TAG|TGA)', 'GCCATGGGGTTTTGA')
['GCCATGGGGTTTTGA']
>>> re.findall(r'[AG]..ATG(?:...)*?(?:TAA|TAG|TGA)', 'GCATGGGGTTTTGA')
[]

あなたの試みでは、記号が同じグループ内の前後にあるすべてのものに適用されるためA、式は 、または式のいずれかに一致します。グループ化されていないため、代わりに式全体に適用されます。G(?:..)ATG(?:...)*?(?:TAA|TAG|TGA)|

>>> re.findall(r'A|G(?:..)ATG(?:...)*?(?:TAA|TAG|TGA)', 'A')
['A']
>>> re.findall(r'A|G(?:..)ATG(?:...)*?(?:TAA|TAG|TGA)', 'GCCATGGGGTTTTGA')
['GCCATGGGGTTTTGA']

マッチ全体で特定の数の文字を一致させる必要がある場合は、これら 3 つの文字(?:...)グループを調整して、一致する回数を最小にする必要があります。

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

一致Aするか、またはGその後に 2 文字が続き、ATGGその後に別の 2 文字が続き、次に少なくとも3 文字の 7 倍 (合計 21)、さらに 3 文字の特定のパターン ( TAATAGまたはTGA) が続き、最初の文字から合計で少なくとも 33 文字になります。最後の文字まで。エクストラ..は 3 のパターンを構成し、ATGコメントの例と一致します。

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

質問に示されている例を正しく処理するだけでなく、

>>> re.findall(r'[AG]..ATGG..(?:...){7,}?(?:TAA|TAG|TGA)', 'GCCATGGGGTTTTTTTTTTTTTTTTTTTTTTTTTGA')
['GCCATGGGGTTTTTTTTTTTTTTTTTTTTTTTTTGA']
>>> re.findall(r'[AG]..ATGG..(?:...){7,}?(?:TAA|TAG|TGA)', 'GCATGAGGTTTTTTTTTTTTTTTTTTTTTTTTTGA')
[]
于 2013-03-12T19:34:35.747 に答える
1

少なくとも 30 文字を確保するには、{n,}量指定子を使用します。

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

これにより、ATG の開始部分と TAA|TGA|TAG ターミネータの間で少なくとも 9 つのトリプレット (27 文字) を読み取ることができます。

于 2013-03-12T19:48:28.440 に答える