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

软件和网站开发以及相关技术探讨
头像
banban
帖子: 3340
注册时间: 2008-03-23 17:01

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

#1

帖子 banban » 2008-08-04 9:37

perl 用正则表达式对一个字符串进行匹配时,如果匹配结果有好几个,那该把这好几个结果都输出/储存到变量中呢?比如,匹配一段字符串中(如atggcagttggtacctaagcattdggtacccgtta)以“ggtacc”结尾的长度为10的子字符串(相当于酶切的操作),这个字符串中有好几个满足条件的子字符串,那当如何将它们都输出呢?
我知道perl 的正则表达式有一个用“()”返回匹配字符串的功能,把匹配的放进变量$1中,可是这样只显示一个匹配的结果,怎么把所有匹配的都储存起来呢?
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

#2

帖子 xiooli » 2008-08-04 9:54

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是搞生物的么?
头像
banban
帖子: 3340
注册时间: 2008-03-23 17:01

#3

帖子 banban » 2008-08-04 10:26

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是搞生物的么?
哦,这样阿,偶可以参考一下阿,多谢了……
我是学生物的,数量遗传方向……
wuchuanren
帖子: 99
注册时间: 2008-01-31 16:55

#4

帖子 wuchuanren » 2008-08-04 10:39

sed里有匹配第几个文本的参数,perl试了一下,居然不这么表示。
还请各位给出个正规的方法
上次由 wuchuanren 在 2008-08-04 12:49,总共编辑 1 次。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#5

帖子 eexpress » 2008-08-04 10:47

grep -o 不好吗
● 鸣学
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

#6

帖子 xiooli » 2008-08-04 11:02

不好意思lz,我原先那个有点问题,就是最后那条链多加了个tag,再来一个超级简单的

代码: 全选

<(︶︿︶)>[~]:tag=ggtacc
<(︶︿︶)>[~]:echo atggcagttggtacctaagcattdggtacccgtta |sed "s/$tag/&\n/g"
atggcagttggtacc
taagcattdggtacc
cgtta
头像
banban
帖子: 3340
注册时间: 2008-03-23 17:01

#7

帖子 banban » 2008-08-04 15:33

xiooli 写了:不好意思lz,我原先那个有点问题,就是最后那条链多加了个tag,再来一个超级简单的

代码: 全选

<(︶︿︶)>[~]:tag=ggtacc
<(︶︿︶)>[~]:echo atggcagttggtacctaagcattdggtacccgtta |sed "s/$tag/&\n/g"
atggcagttggtacc
taagcattdggtacc
cgtta
哦,没关系,多谢了。不过,perl 里面好像是没有echo 的,我再想一想…… :roll:
heejun
帖子: 60
注册时间: 2006-05-01 12:29
来自: zju

#8

帖子 heejun » 2008-08-05 20:34

可以使用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?
头像
banban
帖子: 3340
注册时间: 2008-03-23 17:01

#9

帖子 banban » 2008-08-05 20:49

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?
貌似结果不正确,我想要的结果是要显示几个字符串的,难道要用到多维数组?不对,维数又不能确定,容我想想……
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

#10

帖子 xiooli » 2008-08-05 21:20

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

代码: 全选

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

#11

帖子 banban » 2008-08-05 21:28

xiooli 写了:lz难道一定得用perl吗?用bash或者awk简单很多啊,特别是awk用来处理数据简直神了。
不是我非要用perl 的阿,是老师布置的一道作业题,呵呵,不好意思……
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

#12

帖子 xiooli » 2008-08-05 21:30

banban 写了:
xiooli 写了:lz难道一定得用perl吗?用bash或者awk简单很多啊,特别是awk用来处理数据简直神了。
不是我非要用perl 的阿,是老师布置的一道作业题,呵呵,不好意思……
:em65 ,你们老师肯定是perl饭咯?
头像
kofshower
帖子: 1343
注册时间: 2007-03-13 11:23
联系:

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

#13

帖子 kofshower » 2008-08-05 21:38

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>;"

上次由 kofshower 在 2008-08-05 21:46,总共编辑 1 次。
"We are all in the mud, but some of us are looking at the stars." (Oscar Wilde)
We are not born for ourselves.
人生天地间,并非为自己
Homepage:http://sites.google.com/site/polarisnotme/
头像
banban
帖子: 3340
注册时间: 2008-03-23 17:01

#14

帖子 banban » 2008-08-05 21:42

xiooli 写了:
banban 写了: :em65 ,你们老师肯定是perl饭咯?
perl饭是什么意思阿?
头像
kofshower
帖子: 1343
注册时间: 2007-03-13 11:23
联系:

#15

帖子 kofshower » 2008-08-05 21:43

xiooli 写了:
banban 写了:
xiooli 写了:lz难道一定得用perl吗?用bash或者awk简单很多啊,特别是awk用来处理数据简直神了。
不是我非要用perl 的阿,是老师布置的一道作业题,呵呵,不好意思……
:em65 ,你们老师肯定是perl饭咯?
perl 饭 == perl fans
很多时候脚本语言干的事情比命令还要简单啊
比如ruby -p执行语句 -l loop全部文件 -i备份,而且里面还可以直接调用脚本命令的
"We are all in the mud, but some of us are looking at the stars." (Oscar Wilde)
We are not born for ourselves.
人生天地间,并非为自己
Homepage:http://sites.google.com/site/polarisnotme/
回复