Categorized | 数据分析

用perl匹配字符串并返回该匹配的位置

Posted on 08 五月 2010 by 柳城 ,阅读 735

这次讲讲perl里跟模式匹配或叫正则表达式有关的东西。

最近 ghxiao 童鞋常常问我用perl处理数据的问题。今天来分享一段代码吧。

比如说,给出一个序列文件,里面都是Fasta格式的序列。 然后序列里面有一些NNNNNN的连续字符。

问题就是要得出这些NNNN的一段字符在该序列的具体位置。(就是匹配某字符串)

例子文件:seq.fasta

>CMM_00532
CGCGCGCTGTGCTACGCAGGCCTCTTCCAGGCCCATCTCCCGGCGGCGTGCACCACTACC
AGGATGGTGTGCGTGGGCGGGGGCGCCGCCGAGCTGGTCGCCTTTGCCAGCTTCTTGGGC
GACGACGACGACGACGACGGGGCGCACAGCAGCAGGCGCGGGGAGCTGACGCTNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGTCGACGCGGCGCCGTGGGAGGGCGT
CGCGGACACGGTGCTGCGCGCGCTCACGACGCCGCTGCCGCTGTCCCCAGTCCGGAGCAG
>CMM_00589
ACGGGCGTGTTCCTGGCGTACGGCGGCAGCGACGATGCGCTGCCGGAGGCGGGCCTCGCG
GTGCGCATGAACGACGGGCCTTCGGGCCCTGCGTTTTGGCCGCAGCCGCGCCTGCGGCTC
ATGGAGATGCTGCTGCCGTACCTCGACCAGCACCGCTTCGCGGCCGGCGATATNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGCCTGGCATCTGCGGCAGCAGTGGGAC
GTGCCGCGGACGCACGCGTACTACGTGCCGCCCGGCGCCGTGCGGACGGCCGCGCCGCTG
CTGCTCATGGCGGCGACGCGCGACCCCGTGACGCCGTATGCGGCGGCGCGCGCGGCGCTC
>CMM_00662
GCCGTACTCTCCCAGAACGACTTGGCCTCTGCCCGTACCCTCTTTAAAGACAACCTCAAC
CTGACGCCCTATATTGCCTCGACCGAGTGCAGCGGCGTGTGGGCGCGCCGNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGCCGCCGGACGAGGAGCGCGGCATGGTC
GAGGTCGGGTACGGGATCGACCCGGCGTGCCGGCGGCGGGGACACGCGCGGGCGGCGCTG
>CMM_00942
CTCAACCTGCGCGACGCCGGCGCCGTGGCGGGCAGCGCGATCCCCGCCGGGCGCGTGTAC
CGCTGCGGCACGCTCGAGTACGCGGCCGCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNCTCGCCGACTTTGCCGAGGCCGGGGCGTCGCCGCCTGGCGCACGCAGTAC
CTCCACGTCGCGCTGGCGTATGCGCCCACGTTCCGCGCCGTCCTGGAGCATGTGCGCGAC

只取了一小部分数据。

分析:

  • 1,CMM_开头的是该序列的ID
    2,序列有几行。所以要去掉换行符,先变成一行。这样才能得出正确的位置。

代码例子:temp.pl

$/ = ">";

print "id\tstart\tend\tlen\n";  #先输出Title
while(<>){
	if($_ =~ /(CMM.*?)\s(.*)>/ms){ #第一个括号匹配ID。第二个匹配序列
		$id = $1;
		$seq = $2;
		$seq =~ s/\s//g; #把序列里的换行去掉。变成一列
		while ($seq =~ m/(N+)/g) { #匹配一个N或以上的字符
			$len = length($1); #返回这段匹配的长度
			$end = pos($seq); #用pos函数返回该匹配的终止位置
			$start = $end - $len + 1; #计算出起始位置
			print "$id\t$start\t$end\t$len\n"; #输出结果
		}
	}
}
运行 perl temp.pl seq.fasta >output

输出output文件。

~完。

转载请注明 : 来源于 用perl匹配字符串并返回该匹配的位置 | 柳城

赞助商

15条评论 于 “用perl匹配字符串并返回该匹配的位置”

  1. ifenwen ifenwen Says:

    看不懂 [流泪]

    [回复]

  2. www.taobao.com www.taobao.com Says:

    学习一下!

    [回复]

  3. 皮肤保养 皮肤保养 Says:

    太专业了。。

    [回复]

  4. 传奇外挂下载 传奇外挂下载 Says:

    我PHP不行,看不懂了!!!!!

    [回复]

  5. 传奇服务端 传奇服务端 Says:

    好像不是PHP吧!楼上的看错了!

    [回复]

  6. 请输入关键词 请输入关键词 Says:

    perl...

    [回复]

  7. 电脑资讯网 电脑资讯网 Says:

    好像不是PHP吧!、

    [回复]

  8. 请输入关键词 请输入关键词 Says:

    太专业了。。

    [回复]

  9. bio_bird bio_bird Says:

    直接把序列读进去了 比较占内存啊

    [回复]

  10. 红豆冰山 红豆冰山 Says:

    我正在做相关的事情 希望进一步探讨 加了你gtalk [呲牙]

    [回复]

  11. 优购物 优购物 Says:

    收藏了,

    [回复]

  12. ketherine_ws ketherine_ws Says:

    这里有个问题
    我每次运行都会漏掉最后一个序列

    [回复]

  13. 去黑头 去黑头 Says:

    yun云里雾里

    [回复]

  14. tempo8 tempo8 Says:

    if($_ =~ /(CMM.*?)\s(.*)>/ms)
    >(多余)将丢失最后一条记录!

    (CMM.*?)\s
    其中CMM可以不要!
    为什么不是\n换行符?但是\s也work!奇怪!

    [回复]

Leave a Reply

广告招租

[强] [握手] [可爱] [ok] [呲牙] :) [偷笑] [流泪] [疑问] [亲亲] [擦汗] [得意] [衰] [可怜] [抱拳] [坏笑] more »

无觅相关文章插件,快速提升流量