perl搜尋的模糊比對Regular Expression

請問perl該如何下Regular Expression ,

才能使得搜尋 CGAGATAGT

而也能夠找出CCGAGACTAGT (多了C,C)

或是CGAGGATATGT(多了G,T)

....

這樣的格式呢?

單純的似乎無法 if ($string=~/CGAGATAGT/)

感謝回答了.

Update:

比如說

找尋:AGATA

而相似的有:

AG(A)AT(C)A =(多AC)

(T)AGAT(C)A =(多TC)

(T)AGATA(G) =(多TG)

AGA(G)TA(T) =(多GT)

A(G)GATA(A) =(多GA)

就是多出了兩個而位置不同的

Update 2:

我想法是可不可以先判斷'找尋'的長度後然後在隨機在其中插入atcg

比如說:程式自己產生以下然後在去回圈中判斷是否符合....

(A)A(A)GATA

(A)A(G)GATA

....

(A)A(A)GATA

(T)A(T)GATA

...

(A)A(A)GATA

..

(G)A(G)GATA

.....

可是一想到這樣位置插入舊有上千種...光是讓她自動生成在比對就有點呆了...

順序大概是找多兩個不一的,位置不連續的.

Update 3:

(A)AG(A)ATA

(A)AG(G)ATA

....

(A)AGA(A)TA

(A)AGA(G)TA

.....

Update 4:

您好:

我看了您的程式後大概有了新的進展:

$RE = "([ACGT]?)";

substr($ifno, 1, 0) = "$RE"; #插入搜尋表示

substr($ifno, 11, 0) = "$RE"; #插入搜尋表示

substr($ifno, 21, 0) = "$RE"; #插入搜尋表示

substr($ifno, 31, 0) = "$RE"; #插入搜尋表示

用來模仿

#$ifno="A($RE)G($RE)A($RE)T($RE)A";

我在努力試試,感謝您的指教!!!

if($string =~ /$ifno/ && length....

Update 5:

$string="AGAATAAGAATA"; #分析:AG(A)ATAAGA(A)TA

$ifno="AGATA";

$R = "([ACGT]?)";

substr($ifno, 1, 0) = "$R";

substr($ifno, 11, 0) = "$R";

substr($ifno, 21, 0) = "$R";

substr($ifno, 31, 0) = "$R";

if($string =~ /$ifno/ && length($1 . $2 . $3 . $4)

Update 6:

當$string="ACGATGAAGATA";$ifno="AGATA";

符合規則,但顯示不符合....

A(C)GAT(G)AAGATA

但其實$string中參雜一段:A(C)GAT(G)A

1 Answer

Rating
  • Luke
    Lv 4
    1 decade ago
    Favorite Answer

    你必需先說明 CGAGATAGT 和 CCGAGACTAGT、CGAGGATATGT 之間為什麼會有符合的關係...

    舉例來說,我定義的符合關係是

    「我要找到 CGAGATAGT 字串,當中可以任意插入兩個以內的 A, C, G, T 於任意位置」

    如果用我這個定義,就可以說明為什麼你所舉例的後兩個字串會符合第一個字串

    當然這個定義可能不是你的定義,所以你必需先明確說明你的定義,才能寫出 Regular Expression

    2006-05-23 23:35:54 補充:

    我提供一個方法

    以你第二個例子 AGATA 為例

    --------------------------------------------------------------------------------------------------------

    $RE = "[ACGT]?";

    if($string =~ /A($RE)G($RE)A($RE)T($RE)A/ && length($1 . $2 . $3 . $4) <= 2) {

    #此處表示符合原定義

    } else {

    #此處表示「不」符合原定義

    }

    --------------------------------------------------------------------------------------------------------

    A($RE)G($RE)A($RE)T($RE)A

    表示在 AGATA 的間隔中允許出現 $RE 的定義

    (也就是可以出現一個或零個的 ACGT 中的任一字元)

    以 A(C)GAT(G)A 為例

    第一個和第四個 ($RE) 會分別是 C 和 G

    所以 $1 == 'C'; $2 == ''; $3 == ''; $4 == 'G'

    因為只允許出現兩個以內的多餘字元

    所以 $1 . $2 . $3 . $4 串聯起來的字串長度要小於等於 2

    如果原定義的字串越長,則要加入越多個 ($RE) 在間隔之間

    而要串聯的變數就要越長,$5, $6...etc

    PS. 此處我忽略頭尾有多餘字元的可能,事實上我覺得強調頭尾的意義不大

      不過如果你有需要強調頭尾的多餘字元,可以改成

      ($RE)A($RE)G($RE)A($RE)T($RE)A($RE)

      當然後面的變數就要串聯到 $6

    2006-05-24 03:28:49 補充:

    不知道你所謂的不行是出現了什麼非預期的結果嗎?我使用你的 code 去執行,會得到「符合」的結果這看起來還滿正常的 ^^"

    2006-05-25 03:18:40 補充:

    當 $string="ACGATGAAGATA"; 時我用你的 code 執行,一樣是得到「符合」的結果並沒有發現什麼問題呀...會不會是你的 code 有額外的內容,導致結果受到影響?

    • Login to reply the answers
Still have questions? Get your answers by asking now.