获取原始订单的DNA子串

时间:2011-11-29 12:21:47

标签: c# regex perl dna-sequence

我想获得长DNA序列的子串

例如,给定:

1/ATXGAAATTXXGGAAGGGGTGG
2/AATXGAAGGAAGGAAGGGGATATTX
3/AAAAAATTXXGGAAGGGGXTTTA
4/AAAATTXXATAXXGGAAGGGGXTXG
5/ATTATTGTTXAXTATTT

输出为:

1/TXG    -  TTXX
2/TXG     -
3/       -  TTXX
4/TTXX  -   TXG
5/             -    

我尝试了以下正则表达式模式:

(TXG|TTXX) 

并且它有效,结果放在列表中,但我不知道如何检索原始序列中出现的每个结果的顺序。那是, 是TTXXTXG分别出现在序列4中的第一个和第二个,而第二个和第一个出现在序列1中;并且在第二和第三个结果中,这更难,因为match-xx函数调用不提供从所讨论的序列中获取的子字符串的索引。感谢您的见解。

3 个答案:

答案 0 :(得分:3)

怎么样:

#!/usr/bin/perl 
use strict;
use warnings;
use Data::Dump qw(dump);

my %res;
while(my $line = <DATA>) {
    chomp$line;
    while($line =~ /TXG|TTXX/g) {
        push @{$res{$line}}, "found $& at pos:".(pos($line)-length($&));
    }
}
dump%res;

__DATA__
ATXGAAATTXXGGAAGGGGTGG
AATXGAAGGAAGGAAGGGGATATTX
AAAAAATTXXGGAAGGGGXTTTA
AAAATTXXATAXXGGAAGGGGXTXG
ATTATTGTTXXXTATTT

<强>输出:

(
  "ATTATTGTTXXXTATTT",
  ["found TTXX at pos:7"],
  "AATXGAAGGAAGGAAGGGGATATTX",
  ["found TXG at pos:2"],
  "AAAAAATTXXGGAAGGGGXTTTA",
  ["found TTXX at pos:6"],
  "AAAATTXXATAXXGGAAGGGGXTXG",
  ["found TTXX at pos:4", "found TXG at pos:22"],
  "ATXGAAATTXXGGAAGGGGTGG",
  ["found TXG at pos:1", "found TTXX at pos:7"],
)

答案 1 :(得分:0)

如果你输入2个匹配函数怎么办?

my $result="";

$result.="TXG" if(/TXG/);
$result.="TTXX" if (/TTXX/);

print $result;

答案 2 :(得分:0)

perl -ne'($a)=/(TXG)/gc;($b)=/\G.*(TTXX)/;($a,$b)=($1,$a)if$a and not$b and/(TTXX)/;m{^(\d/)};printf"$1%5s -%5s\n",$a,$b'