免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3537 | 回复: 9
打印 上一主题 下一主题

求教关于perl的模式匹配问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-24 21:38 |只看该作者 |倒序浏览
文本如下:
>1FFK:1|PDBID|CHAIN|SEQUENCE
PRVELEIPEDVDAEQDHLDITVEGDNGSVTRRLWYPDIDVSVDGDTVVIESDEDNAKTMSTIGTFQSHIENMFHGVTEGW
>1FFK:9|PDBID|CHAIN|SEQUENCE
UUAGGCGGCCACAGCGGUGGGGUUGCCUCCCGUACCCAUCCCGAACACGGAAGAUAAGCCC
...
...

以">"为标记的行为序列的描述,有的行全都由A,C,G,U(组成顺序不一样)四个字符组成(例如第四行),有的行则由更多的字符组成(例如第二行)。我想请问,怎样是用模式匹配来分别匹配这样的行,然后输出呢?还有怎么匹配以">"为标记的行呢?诚求各位牛人帮助,感激不尽!

论坛徽章:
0
2 [报告]
发表于 2013-08-24 21:51 |只看该作者
$_ =~ /^>/;

论坛徽章:
0
3 [报告]
发表于 2013-08-25 11:48 |只看该作者
回复 2# kggg

我想请问怎么匹配全都由A,C,G,U(组成顺序不一样)四个字符组成的行呢?(例如第四行),

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
4 [报告]
发表于 2013-09-05 17:24 |只看该作者
可以用split进行分割,然后用关联数组进行存储,可以知道每行各个字母出现的次数,根据字母出现的次数就可以确定是什么模式的了

论坛徽章:
0
5 [报告]
发表于 2013-09-05 17:35 |只看该作者
回复 3# dpxiong19

$_ =~ /[ACGU]/;


   

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
6 [报告]
发表于 2013-09-05 17:37 |只看该作者
第一个是 "怎样是用模式匹配来分别匹配这样的行,然后输出呢?"
  1. while(<DATA>){
  2.     print if(!/^>/ && /[A]/ && /[C]/ && /[G]/ && /[U]/);
  3. }
复制代码
第二个 "还有怎么匹配以">"为标记的行呢?"
  1. while(<DATA>){
  2.     print if(/^>/);
  3. }
复制代码
这样就可以了吧

论坛徽章:
0
7 [报告]
发表于 2013-09-05 18:13 |只看该作者
/^[ACGU]+$/
简单明了

论坛徽章:
0
8 [报告]
发表于 2013-09-06 10:34 |只看该作者
没必要行首和行尾描位吧,/[ACGU]+/就ok了~
回复 7# 帅哥已注册


   

论坛徽章:
0
9 [报告]
发表于 2013-09-09 13:08 |只看该作者
use strict;
use warnings;
use Data:umper;

exit(main(@ARGV));

sub getMeta{
    my $record = shift;
    my @lines = split("\n", $record);

    my ($id) = ( $lines[0] =~ /^>1FFK\d+)/);
    my $type;

    my $content = $lines[1];
    $content =~ s/\s+//g;
    if ($content =~ /^[ACGU]+$/) {
        $type = "ACGU";
    } else {
        $type = "N_ACGU";
    }
    return { ID => $id,
             TYPE => $type
         };
}



sub main{
    my $text = <<'END';
>1FFK:1|PDBID|CHAIN|SEQUENCE
    PRVELEIPEDVDAEQDHLDITVEGDNGSVTRRLWYPDIDVSVDGDTVVIESDEDNAKTMSTIGTFQSHIENMFHGVTEGW
>1FFK:9|PDBID|CHAIN|SEQUENCE
    UUAGGCGGCCACAGCGGUGGGGUUGCCUCCCGUACCCAUCCCGAACACGGAAGAUAAGCCC
END

    my @records = split(/(?=>1FFK)/, $text);

    my @records_meta ;

    foreach my $record (@records) {
        push( @records_meta, getMeta( $record ) );
    }
    print Dumper \@records_meta;
}


$ perl test.pl
$VAR1 = [
          {
            'ID' => '1',
            'TYPE' => 'N_ACGU'
          },
          {
            'ID' => '9',
            'TYPE' => 'ACGU'
          }
        ];

论坛徽章:
0
10 [报告]
发表于 2013-09-09 13:16 |只看该作者
看三楼LZ的补充,只要求匹配UCAG,如果不加锚点那么像“VACAGUCAGBD”也能匹配上了 回复 8# 饭饭小鱼儿


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP