私のパターンがこの結果を生成するのはなぜですか? ATG
を含まない 3 のシーケンスが見つかることを期待していますTAA
。
In [102]: s = 'GATGCCTAAG'
In [103]: pat = re.compile("(ATG((\w\w\w)*)(?!TAA))")
In [104]: pat.findall(s)
Out[104]: [('ATGCCTAAG', 'CCTAAG', 'AAG')]
私のパターンがこの結果を生成するのはなぜですか? ATG
を含まない 3 のシーケンスが見つかることを期待していますTAA
。
In [102]: s = 'GATGCCTAAG'
In [103]: pat = re.compile("(ATG((\w\w\w)*)(?!TAA))")
In [104]: pat.findall(s)
Out[104]: [('ATGCCTAAG', 'CCTAAG', 'AAG')]
このfindall
メソッドは、一致のリストを返します。パターンにキャプチャ グループが含まれている場合、各一致は、パターン内の各キャプチャ グループによって一致した文字列のタプルです。
ドキュメントから:
pattern
inのすべての重複しない一致string
を文字列のリストとして返します。はstring
左から右にスキャンされ、見つかった順序で一致が返されます。パターンに 1 つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。空の一致は、別の一致の先頭に触れない限り、結果に含まれます。
パターンには 3 つのキャプチャ グループが含まれています。グループはネストされています。最初の (そして最も外側の) グループは、パターン全体(ATG((\w\w\w)*)(?!TAA))
です。2番目のグループは((\w\w\w)*)
. 3番目のグループは(\w\w\w)
.
否定先読みアサーション は、キャプチャ グループ(?!TAA)
ではないことに注意してください。
本質的に、あなたのパターンは codon に一致しATG
、その後にできるだけ多くのコドンが続くことを示していますが、一致がコドンで止まる場合は 2 つのコドンをバックアップしTAA
ます。*
は貪欲なので、パターンは真ん中のコドンと一致しますTAA
。入力文字列の末尾にあるTAA
コドン (およびその前のコドン)のみを拒否します。TAA
キャプチャ グループのため、パターンは、返された各一致に 3 つの文字列が含まれている必要があることを示しています。一致したコドンのシーケンス全体、最初の を除く一致したコドンのシーケンスATG
、およびシーケンス内の最後に一致したコドンです。
(?:...)
次のように、を使用してグループを非キャプチャとしてマークできます。
In [5]: pat = re.compile("(?:ATG(?:(?:\w\w\w)*)(?!TAA))")
パターンにキャプチャ グループが含まれていない場合findall
は、各一致をタプルではなく単一の文字列として返します。
In [6]: pat.findall(s)
Out[6]: ['ATGCCTAAG']
最初の. _ TAA
TAA
pat = re.compile("ATG(?:(?!TAA)\w\w\w)*")
これは、最初の の後の各コドンで、コドンATG
と一致しないことを表明しTAA
ます。
最初のコドンで停止したい場合はTAA
、そのコドンが と整列していなくても、次のATG
ように実行できます。
In [7]: pat = re.compile("ATG(?:(?!.{0,2}TAA)\w\w\w)*")
In [8]: pat.findall(s)
Out[8]: ['ATG']
In [10]: pat.findall('ATGCCTGAATATAAG')
Out[10]: ['ATGCCTGAA']
あなたの最善の解決策は、TAA をキャプチャする非常に単純な正規表現を作成してから、TAA パターンを取り除くフィルターを適用することだと思います。
また、re モジュールでは、@rob mayoff が書いたものに加えて、* にはその項目が含まれていない可能性があります。
ドキュメントから:
*
結果の RE が、前の RE の 0 回以上の繰り返し (可能な限り多くの繰り返し) と一致するようにします。ab* は、'a'、'ab'、または 'a' の後に任意の数の 'b' が続くものと一致します。