分页: 1 / 3

[问题]一个关于perl 的正则表达式的问题

发表于 : 2008-08-04 9:37
banban
perl 用正则表达式对一个字符串进行匹配时,如果匹配结果有好几个,那该把这好几个结果都输出/储存到变量中呢?比如,匹配一段字符串中(如atggcagttggtacctaagcattdggtacccgtta)以“ggtacc”结尾的长度为10的子字符串(相当于酶切的操作),这个字符串中有好几个满足条件的子字符串,那当如何将它们都输出呢?
我知道perl 的正则表达式有一个用“()”返回匹配字符串的功能,把匹配的放进变量$1中,可是这样只显示一个匹配的结果,怎么把所有匹配的都储存起来呢?

发表于 : 2008-08-04 9:54
xiooli
perl不懂,不过用shell 和 awk倒是简单

代码: 全选

<(︶︿︶)>[~]:tag=ggtacc
<(︶︿︶)>[~]:echo atggcagttggtacctaagcattdggtacccgtta |awk -F"$tag" '{for (i=1;i<=NF;i++)print $i;}' |sed "s/$/$tag/"
atggcagttggtacc
taagcattdggtacc
cgttaggtacc
ps:lz是搞生物的么?

发表于 : 2008-08-04 10:26
banban
xiooli 写了:perl不懂,不过用shell 和 awk倒是简单

代码: 全选

<(︶︿︶)>[~]:tag=ggtacc
<(︶︿︶)>[~]:echo atggcagttggtacctaagcattdggtacccgtta |awk -F"$tag" '{for (i=1;i<=NF;i++)print $i;}' |sed "s/$/$tag/"
atggcagttggtacc
taagcattdggtacc
cgttaggtacc
ps:lz是搞生物的么?
哦,这样阿,偶可以参考一下阿,多谢了……
我是学生物的,数量遗传方向……

发表于 : 2008-08-04 10:39
wuchuanren
sed里有匹配第几个文本的参数,perl试了一下,居然不这么表示。
还请各位给出个正规的方法

发表于 : 2008-08-04 10:47
eexpress
grep -o 不好吗

发表于 : 2008-08-04 11:02
xiooli
不好意思lz,我原先那个有点问题,就是最后那条链多加了个tag,再来一个超级简单的

代码: 全选

<(︶︿︶)>[~]:tag=ggtacc
<(︶︿︶)>[~]:echo atggcagttggtacctaagcattdggtacccgtta |sed "s/$tag/&\n/g"
atggcagttggtacc
taagcattdggtacc
cgtta

发表于 : 2008-08-04 15:33
banban
xiooli 写了:不好意思lz,我原先那个有点问题,就是最后那条链多加了个tag,再来一个超级简单的

代码: 全选

<(︶︿︶)>[~]:tag=ggtacc
<(︶︿︶)>[~]:echo atggcagttggtacctaagcattdggtacccgtta |sed "s/$tag/&\n/g"
atggcagttggtacc
taagcattdggtacc
cgtta
哦,没关系,多谢了。不过,perl 里面好像是没有echo 的,我再想一想…… :roll:

发表于 : 2008-08-05 20:34
heejun
可以使用global match

代码: 全选

#!/usr/bin/perl
use strict;
use warnings;
my $data = "atggcagttggtacctaagcattdggtacccgtta"; 
my @match = $data =~ m/([atcgdu]{4}ggtacc)/g; 
print "$_\n" foreach @match;
agttggtacc
attdggtacc
but why?
碱基里面有d?

发表于 : 2008-08-05 20:49
banban
heejun 写了:可以使用global match

代码: 全选

#!/usr/bin/perl
use strict;
use warnings;
my $data = "atggcagttggtacctaagcattdggtacccgtta"; 
my @match = $data =~ m/([atcgdu]{4}ggtacc)/g; 
print "$_\n" foreach @match;
agttggtacc
attdggtacc
but why?
碱基里面有d?
貌似结果不正确,我想要的结果是要显示几个字符串的,难道要用到多维数组?不对,维数又不能确定,容我想想……

发表于 : 2008-08-05 21:20
xiooli
banban 写了:
xiooli 写了:不好意思lz,我原先那个有点问题,就是最后那条链多加了个tag,再来一个超级简单的

代码: 全选

<(︶︿︶)>[~]:tag=ggtacc
<(︶︿︶)>[~]:echo atggcagttggtacctaagcattdggtacccgtta |sed "s/$tag/&\n/g"
atggcagttggtacc
taagcattdggtacc
cgtta
哦,没关系,多谢了。不过,perl 里面好像是没有echo 的,我再想一想…… :roll:
lz难道一定得用perl吗?用bash或者awk简单很多啊,特别是awk用来处理数据简直神了。

发表于 : 2008-08-05 21:28
banban
xiooli 写了:lz难道一定得用perl吗?用bash或者awk简单很多啊,特别是awk用来处理数据简直神了。
不是我非要用perl 的阿,是老师布置的一道作业题,呵呵,不好意思……

发表于 : 2008-08-05 21:30
xiooli
banban 写了:
xiooli 写了:lz难道一定得用perl吗?用bash或者awk简单很多啊,特别是awk用来处理数据简直神了。
不是我非要用perl 的阿,是老师布置的一道作业题,呵呵,不好意思……
:em65 ,你们老师肯定是perl饭咯?

Re: [问题]一个关于perl 的正则表达式的问题

发表于 : 2008-08-05 21:38
kofshower
banban 写了:perl 用正则表达式对一个字符串进行匹配时,如果匹配结果有好几个,那该把这好几个结果都输出/储存到变量中呢?比如,匹配一段字符串中(如atggcagttggtacctaagcattdggtacccgtta)以“ggtacc”结尾的长度为10的子字符串(相当于酶切的操作),这个字符串中有好几个满足条件的子字符串,那当如何将它们都输出呢?
我知道perl 的正则表达式有一个用“()”返回匹配字符串的功能,把匹配的放进变量$1中,可是这样只显示一个匹配的结果,怎么把所有匹配的都储存起来呢?
之后的依次是$2,$3,$4,$5.
我是从ruby这们语法和perl和类似的语言想到的.后来看了perl handbook.
我本身不会perl
Perl 的正则表达式中如果出现 () ,则发生匹配或替换后 () 内的模式被 Perl 解释器自动依次赋给系统 $1, $2 ...... 请看下面的例子:



$string = "I love perl";

$string =~ s/(love)/<$1>;/; # 此时 $1 = "love",并且该替换的结果是将 $string 变为 "I <love>; perl"

$string = "i love perl";

$string =~ s/(i)(.*)(perl)/<$3>;$2<$1>;/; # 这里 $1 = "i",$2 = " love ",$3 = "perl",并且替换后 $string 变为 "<perl>; love <i>;"


发表于 : 2008-08-05 21:42
banban
xiooli 写了:
banban 写了: :em65 ,你们老师肯定是perl饭咯?
perl饭是什么意思阿?

发表于 : 2008-08-05 21:43
kofshower
xiooli 写了:
banban 写了:
xiooli 写了:lz难道一定得用perl吗?用bash或者awk简单很多啊,特别是awk用来处理数据简直神了。
不是我非要用perl 的阿,是老师布置的一道作业题,呵呵,不好意思……
:em65 ,你们老师肯定是perl饭咯?
perl 饭 == perl fans
很多时候脚本语言干的事情比命令还要简单啊
比如ruby -p执行语句 -l loop全部文件 -i备份,而且里面还可以直接调用脚本命令的