1

正規表現に少し問題があります。私は次のものを持っています:(A|C|G|T){3}これはA、B、C、Dからの3文字のすべての順列を与えますが、ここで3つの特定のパターンを除外したいと思います:"TAG"、、。で試しましたが、期待どおりの結果が得られません。ルックアラウンド(先読みと後見)を使用しても同じことが言えます。"TAA""TGA"[^]

私が達成しようとしているのは、「ATG」で始まり、「TAG」、「TAA」、または「TGA」のいずれかで終わるすべてのサブ文字列を見つけることです。中央には、A、C、G、またはTのトリプルが必要です。 。

助けてくれてありがとう!

これが私がこれまでにしたことです:

(ATG)((((A|C|G|T)){3})[^TAG][^TAA][^TGA])*(TAG|TAA|TGA)

(ATG)((?!TAG)(?!TAA)(?!TGA)(((A|C|G|T)){3})*)(TAG|TAA|TGA)
4

2 に答える 2

5

私が正しく理解していれば:

1) ATGから始める

2) 「TAG」、「TAA」、および「TGA」を除くいくつかのトリプレット

3) トリプレット「TAG」、「TAA」、「TGA」のいずれか

これはうまくいくはずです:

/
   (ATG)                       # Step 1
   ((?!TAG|TAA|TGA)[ACGT]{3})+ # Step 2
   (TAG|TAA|TGA)               # Step 3
/x

2番目のアイデアとの違いは、量指定子内で否定的な先読みを移動して、「トリプレットの数」ステップを取得し、トリプレットのいずれも例外の1つにならないようにすることです

このソリューションは、ステップ 2 とステップ 3 の要素間の共通性を想定していません。より単純ですが、あなたのケースでは同等の定式化は次のようになります。

1) 「ATG」に一致

2) トリプレットの数を一致させる

3) ... 「TAG」、「TAA」、「TGA」が一致するまで。

これを行うには、ステップ 2 の量指定子を貪欲でないようにする必要があります。これは、ステップ 2 が再び一致するかどうかを試す前に、ステップ 3 の一致をテストするためです。

次に、ソリューションは次のようになります。

/ (ATG) ([ACGT]{3})*? (TAG|TAA|TGA) /x

別の解釈は次のようになります。

1) ATGから始める

2) 三つ子の数

3) トリプレット「TAG」、「TAA」、「TGA」のいずれか

4) 手順 2 で見つかった部分文字列には、部分文字列 'TAG'、'TAA'、'TGA' が含まれていてはなりません。

この場合、2 つの正規表現を使用して解決します。ステップ 1-3 とステップ 4 のテスト用の実装について:

 $sequence =~ /(ATG)([ACGT]{3})(TAG|TAA|TGA)/ and $2 !~ /TAG|TAA|TGA/;
于 2012-11-29T11:21:36.383 に答える
0

あなたの場合、途中で何かを除外する必要はありません-最長のシーケンスを一致させたいと仮定します。それは Perl*+がすでに行っていることです: 彼らは貪欲で、可能な限り長いシーケンスに一致します。

したがって、簡単な例では、入力がであり、 で終わるすべてABAACAACのものを一致させたい場合、または途中で、​​だけでなく、すでに一致します。BCABCm/A[ABC]*C/BAACAACBAAC

一般に、中間の特定のものをうまく除外するために正規表現を使用することはできません (ゼロ幅の負の先読み/後読みアサーションのようなものはありますが)。

編集:そして、「終了パターン」の最初の出現でマッチングを停止したい場合は、単に*後置して貪欲にしないで?ください。貪欲ではない私の例: m/A[ABC]*?C/、ただし、この場合、 char クラスからを省略することもできますC(この単純化された例では 1 文字のみであるため)。

于 2012-11-29T11:17:35.607 に答える