0

私のパターンがこの結果を生成するのはなぜですか? 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')]
4

3 に答える 3

3

このfindallメソッドは、一致のリストを返します。パターンにキャプチャ グループが含まれている場合、各一致は、パターン内の各キャプチャ グループによって一致した文字列のタプルです。

ドキュメントから:

patterninのすべての重複しない一致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']

最初の. _ TAATAA

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']
于 2013-11-14T23:15:19.463 に答える
0

あなたの最善の解決策は、TAA をキャプチャする非常に単純な正規表現を作成してから、TAA パターンを取り除くフィルターを適用することだと思います。

于 2013-11-14T23:22:39.863 に答える
0

また、re モジュールでは、@rob mayoff が書いたものに加えて、* にはその項目が含まれていない可能性があります。

ドキュメントから:

*

結果の RE が、前の RE の 0 回以上の繰り返し (可能な限り多くの繰り返し) と一致するようにします。ab* は、'a'、'ab'、または 'a' の後に任意の数の 'b' が続くものと一致します。

于 2013-11-14T23:19:31.213 に答える