Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

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
  • ?
    Lv 4
    2 decades 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 有額外的內容,導致結果受到影響?

Still have questions? Get your answers by asking now.