美文网首页perl
perl语言正则表达式模版

perl语言正则表达式模版

作者: 食品猪的生信鸡 | 来源:发表于2021-05-20 16:53 被阅读0次

有一个这样的文件:

oas00001.json

我想把它乱七八糟的符号去掉,变成这样:

1.txt

用perl语言如何实现呢?

open(FH, "<oas00001.json") or die "file cannot open, $!"; #打开文件,读取到句柄FH
while(<FH>){ #遍历句柄FH的每一行
    if($_!~/name/){ #如果该行不能匹配name字符串
        next; #那么跳过改行,直接读取下一行
    }
    print $_; #将每一行的内容打印出来
}
close FH #关闭句柄

那么如何将结果写入新文件呢?

很简单在linux的shell或者windows的cmd输入:

perl filt.pl > 1.txt         #filt.pl为上述perl代码存放文件

另外,附一些perl语言强大的正则表达式:

=~// #perl语言匹配符号,//之间为匹配的内容
=~/GAATTC/ #匹配GAATTC字符串
!~/GAATTC/ #不匹配GAATTC字符串
=~/GAAT+C/ #匹配一个或者多个T
=~/GAA[TU]C/ #匹配TT或者UU
=~/GAAT.C/ # .代表一个任意字符
=~/GAAT{1,3}C/ #匹配1到3个T
=~/^C(\W+)A$/ #匹配以C开头,以A结尾,中间任意单词不含空格字符串
\s 空格
\t 一个tab键
\n 换行符

好吧,我不装了,其实,我是想把文件变成这样:

为了将通路和基因富集到一起

上面的代码可以改成这样:

open(FH, "<oas00001.json") or die "file cannot open, $!";
while(<FH>){
    if($_!~/PATH/ and $_!~/EC/){ #对于既不能匹配到PATH又不能匹配到EC的行跳过。
        next;
    }else{ #代码写成if...else...的形式也更加通俗易懂了
        print $_;
    }
    
}
close FH

好的,我的意图又增加了,我想得到这样的结果:

只保留数字

那我可以继续这样做:

use utf8;
binmode(STDOUT,":utf8");
open(FH, "<1.txt") or die "file cannot open, $!";
while(<FH>){
    if($_=~/"name":"\w+/){ #匹配以"name":"开头,后续包含字母或者数字长短不限的单词,只能读到空格
        print "$&\n"; #把匹配到的内容$&打印出来,记得加换行符\n
    }
    
}
close FH

事情还没完,我还想这样,把通路名字和代码保留,只保留Gene ID,像这样:

新需求

很简单:

use utf8;
binmode(STDOUT,":utf8");
open(FH, "<1.txt") or die "file cannot open, $!";
while(<FH>){
    if($_=~/"name":"\w+/){
        if($_=~/PATH/){ #再次进行条件选择,如何一行同时匹配到PATH
            print "$_"; #打印整个一样
        }else{
            print "$&\n"; #否者仅打印匹配到的字符串
        }
    }
}
close FH

这回真的真的是最后一步了,实际上进行GESM分析的关键是构建成这样的数据类型:

Last

怎么办?

看终极代码

use utf8;
binmode(STDOUT,":utf8");
open(FH, "<1.txt") or die "file cannot open, $!";
while(<FH>){
    if($_=~/PATH/){ #如果该行匹配到PATH
            chomp($a = $_);  #chomp函数是将字符串后面的\n去掉,这里$a比$_少了一个换行符
            print "\n"; #在该行前先加一个换行符(注意:这里是关键)
            print "$a"; 
        }else{
            chomp($b = $_); #如果该行不匹配
            print "\t"; #在在该行前先加一个tab
            print "$b"; #
        }
}
close FH

感悟:

利用perl语言或者其他编程语言解决实际问题,其实最重要的是一个思路,不同的语言只是工具,只不过perl语言的正则表达式太过强大,适合生物信息学中对文本文件的处理,由于它可以一行一行的遍历,所以不存在卡死的情况,处理文件只是时间问题。

参考文章:

  1. https://www.bilibili.com/video/BV1KJ411n7Mn?p=4
  2. 菜鸟教程https://www.runoob.com/perl/perl-files.html
  3. https://www.cnblogs.com/dancheblog/p/3528000.html

相关文章

  • Effective Perl-chapter3

    今天这个主要是介绍perl语言中的正则表达式,perl的正则表达式本身就相当于一门语言,而且这门语言甚至比perl...

  • perl语言正则表达式模版

    有一个这样的文件: 我想把它乱七八糟的符号去掉,变成这样: 用perl语言如何实现呢? 那么如何将结果写入新文件呢...

  • 9.2.1 正则表达式语法介绍1

    9.2.1 正则表达式语法介绍1 定界符原子元字符模式修正符 Perl兼容正则表达式 正则表达式作为一个匹配的模版...

  • 9.2.2 正则表达式语法介绍2

    9.2.2 正则表达式语法介绍2 定界符原子元字符模式修正符 Perl兼容正则表达式 正则表达式作为一个匹配的模版...

  • 【Perl编程-6】正则表达式--匹配

    perl语言的强大之处就在于他的正则表达式,Perl的正则表达式的三种形式,分别是匹配,替换和转化: 匹配:m//...

  • 【Perl】——6. 正则表达式

    2021.2.6持续更新中。。。 《Perl语言入门》 1. 正则表达式简介 正则表达式(regular expr...

  • Perl学习05之正则表达式

    本文介绍Perl语言中的正则表达式(Regular Expressions)使用。首发于本人公众号:pythoni...

  • R 正则表达式

    前言 R中的正则表达式模式有三种 1、扩展正则表达式:默认方式 2、Perl风格正则表达式:设置参数perl = ...

  • JavaRegularExpr

    Java 正则表达式和 Perl 的是最为相似的。 在其他语言中,\ 表示:我想要在正则表达式中插入一个普通的(字...

  • Learning Perl 学习笔记 Ch9 正则表达式(三)用

    重新理解正则表达式,Perl中的正则表达式其实不是独立的功能,只是内嵌于某些功能中的子语言, m//就像是文本编辑...

网友评论

    本文标题:perl语言正则表达式模版

    本文链接:https://www.haomeiwen.com/subject/apkbjltx.html