我正在尝试匹配至少四个G重复,每个重复最多分隔7个字符。例如:
AAGGGAAGGGAAAGGGAAGGGAA
我使用以下正则表达式,它应匹配大写和小写字符。
$sequence =~ /((G{3,}[ATGC]{1,7}){3,}G{3,})/gi
这应该匹配至少四个G重复。问题是,当我匹配以下序列时,我得到了积极的打击:
aaagaggaaaaggggaaaaggggaaaaggggaaa
此序列中的第一个重复包含三个g,用a分隔。因此,不应匹配此序列。
解决方案1:问题似乎是/ i修饰符。我可以通过修改正则表达式来纠正它:
$sequence =~ /(([gG]{3,}[aAtTgGcC]{1,7}){3,}[gG]{3,})/g
解决方案2由ikegami提供:否定前瞻。
$sequence =~ /(([?!G]{3,}[ATGC]{1,7}){3,}[G]{3,})/gi
感谢@ikegami提示并提交错误报告。
答案 0 :(得分:4)
$ perl -E'say $& while "aaagaggaaaaggggaaaaggggaaaaggggaaa" =~ /((G{3,}[ATGC]{1,7}){3,}G{3,})/gi'
gggaaaaggggaaaagggg
您发现了一个错误!我提交了bug report。
这个错误至少从5.10开始就存在,并且它出现在最新版本(5.24.0)中。
更新:修复了在2017-05-30上发布的Perl 5.26。