我(认为我)对Perl很有经验,但是我仍然想解决一个令人讨厌的问题。我必须使用以下格式匹配一个字符串(其格式不能更改,该格式是从生物信息学软件输出的):
[\+\-][0-9]+[ACGTacgt]+
实际上,这很容易,尽管模式的重复次数[ACGTacgt]
不是1或更多,而是由定义的次数,[0-9]+
所以它可以是
[...whatever...]+2ac[...whatever...]
+4acta
+3atg
等等..
现在测试正则表达式是否正常工作,我只是在玩替换游戏,我尝试了以下方法:
$mystring =~ s/[\+\-]([0-9]+)[ACGTacgt]{\1}//g
不幸的是,上面的那个家伙无法正常工作,我在抱怨大括号时出错。确实,如果我定义一个合适的数字而不是\ 1,那么事情就起作用了:
$mystring =~ s/[\+\-]([0-9]+)[ACGTacgt]{1}//g
我需要它来工作,因为格式可能包含类似的序列,ac.,.+2caaa..a.c
从这些序列中我必须准确地将+2ca
剩余部分与其余部分分开。
一步就能做到吗?还是有我现在想念的逻辑原因,而这是不可能的?
感谢您的帮助或建议!
贝鲁蒂
{$N}
正则表达式的组成部分是修饰符,不能使用反向引用作为其计数。您可以使用嵌入式perl表达式解决它:
use strict;
use warnings;
my $string = 'ac.,.+2caaa..a.c';
$string =~ s/[+-]([0-9]+)(??{ "[ACGTacgt]{$1}" })//g;
print "$string\n";
请注意,嵌入式子表达式是不得已而为之的,出于明显的原因,它会阻止对正则表达式进行适当的优化-在这种情况下,必须删除匹配的子字符串,这是IMO适当的权衡方案,但是如果您的要求略有不同,则可以拆分-迭代法可能更合适。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句