我(认为我)在 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";
请注意embedded subexpressions是最后的手段,并且出于明显的原因阻止了正则表达式的正确优化 - 在我看来,对于必须删除匹配的子字符串的这种确切情况,这是一个适当的权衡,但如果您的要求略有不同,则可以采用拆分迭代方法更合适。
关于regex - Perl 与正则表达式匹配一个数字以及字符串中该数字指定的多个后续字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59039993/