4

テキスト内の整数が式の最後にある末尾の文字の数を指定するシーケンスを識別する正規表現を探しています。この特定の例は、パイルアップ形式の遺伝子データの挿入と削除を識別するために適用されます。

例えば:

私が検索しているテキストが次の場合:

AtT+3ACGTTT-1AaTTa

挿入と削除を一致させる必要が+3ACGあります。この場合はと-1Aです。整数(n)の部分は、1より大きい任意の整数にすることができ、n個の末尾の文字をキャプチャする必要があります。

単一の挿入または削除をと一致させることは[+-]?[0-9]+[ACGTNacgtn]できますが、整数で指定された末尾のACGTNの正確な数を取得する方法がわかりません。

ここに明白な答えがある場合はお詫び申し上げます。私は何時間も探していました。ありがとう!

(アップデート)

私は通常Pythonで作業します。Pythonのreモジュールで理解できた1つの回避策は、すべてのin / delの整数とスパンの両方を呼び出し、2つを組み合わせて適切な長さのテキストを抽出することです。

例えば:

>>> import re
>>> a = 'ATTAA$At^&atAA-1A+1G+4ATCG'
>>> expr = '[+-]?([0-9]+)[ACGTNacgtn]'
>>> ints = re.findall(expr, a) #returns a list of the integers
>>> spans = [i.span() for i in re.finditer(expr,a)]
>>> newspans = [(spans[i][0],spans[i][1]+(int(indel[i])-1)) for i in range(len(spans))]
>>> newspans
>>> [(14, 17), (17, 20), (20, 26)]

結果のタプルを使用すると、インデルをスライスできます。おそらく最良の構文ではありませんが、機能します!

4

3 に答える 3

2

関数を置換として渡す正規表現置換を使用できます...たとえば

s = "abcde+3fghijkl-1mnopqr+12abcdefghijklmnoprstuvwxyz"

import re

def dump(match):
    start, end = match.span()
    print s[start:end + int(s[start+1:end])]

re.sub(r'[-+]\d+', dump, s)

#output
# +3fgh
# -1m
# +12abcdefghijkl
于 2012-07-28T14:28:12.030 に答える
0

直接可能ではありません。正規表現はそのように「カウント」することはできません。

ただし、正規表現一致エバリュエーターとしてコールバックを許可するプログラミング言語(C#、PHPなど)を使用している場合は[+-]?([0-9]+)([ACGTNacgtn]+)、コールバックで正規表現を希望の長さにトリミングすることができます。

例:C#の場合

var regexMatches = new List<string>();
Regex theRegex = new Regex(@"[+-]?([0-9]+)([ACGTNacgtn]+)");
text = theRegex.Replace(text, delegate(Match thisMatch)
{

    int numberOfInsertsOrDeletes = Convert.ToInt32(thisMatch.Groups[1].Value);
    string trailingString = thisMatch.Groups[2].Value;
    if (numberOfInsertsOrDeletes > trailingString.Length)
    { trailingString = trailingString.Substring(0, numberOfInsertsOrDeletes); }
    regexMatches.Add(trailingString);

    return thisMatch.Groups[0].Value;
});
于 2012-07-28T04:51:54.123 に答える
0

整数の後に任意の文字数が続く単純な Perl パターンは次のとおりです。

 (\d+)(??{"." x $1})

これは非常に簡単です。同意していただけると思います。たとえば、このスニペット:

my $string = "AtT+3ACGTTT-1AaTTa";

print "Matched $&\n" while $string =~ m{
    ( \d+ )            # capture an integer into $1
    (??{ "." x $1 })   # interpolate that many dots back into pattern
}xg;

期待されるものを陽気に出力する

Matched 3ACG
Matched 1A

編集

ああ、私が編集を始めてから Python タグを追加したようですね。おっとっと。まあ、多分これはとにかくあなたに役立つでしょう。

そうは言っても、実際に探しているのが、いくつかの挿入と削除 (編集距離) を許可するあいまい一致である場合は、Matthew Barnett のregexPython 用ライブラリがそれを処理します。挿入と削除は実際には文字列で表されているため、それはあなたがしていることとはまったく違うようです。

しかし、Matthew のライブラリーは非常に優れており、非常に興味深いものであり、Perl ではできない多くのことを実行することさえできます。:) これは、標準の Pythonreライブラリを簡単に置き換えるものです。

于 2012-07-28T15:20:47.227 に答える