2016-12-10 11 views
2

Я пытаюсь совместить не менее четыре G-повтора, каждый повтор разделяется максимум на 7 символов. Пример:Perl регулярное выражение несоответствие повторяющихся строк

AAGGGAAGGGAAAGGGAAGGGAA 

Я использую следующее регулярное выражение, которое должно соответствовать символам верхнего и нижнего регистра.

$sequence =~ /((G{3,}[ATGC]{1,7}){3,}G{3,})/gi 

Это должно соответствовать по меньшей мере четырем повторениям G. Проблема заключается в том, что я получаю положительный удар, когда я сопрягать следующую последовательность:

aaagaggaaaaggggaaaaggggaaaaggggaaa 

первый повтор в этой последовательности содержит три Gs, отделенные друг от друга а. Поэтому эту последовательность не следует сопоставлять.

Решение 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 за подсказку и за отправку отчета об ошибке.

+1

[не похоже] (https://regex101.com/r/osA53E/1) положительное воздействие на вторую последовательность. –

+0

@Nicolas Maltais, OP использует Perl, а не PCRE. – ikegami

+0

Если вы хотите совместить не менее 4 G, почему квантификатор начинается с 3? См. Http://perldoc.perl.org/perlre.html#Regular-Expressions – shawnhcorey

ответ

4
$ perl -E'say $& while "aaagaggaaaaggggaaaaggggaaaaggggaaa" =~ /((G{3,}[ATGC]{1,7}){3,}G{3,})/gi' 
gggaaaaggggaaaagggg 

Вы нашли ошибку! Я подал bug report.

Эта ошибка существует с по крайней мере с 5.10, и она присутствует в последней версии (5.24.0).

Обновление: исправлено в Perl 5.26, выпущенном на 2017-05-30.

+0

Мне нужен G в [ATGC], потому что соединительная последовательность может быть aaagaaa. – Zipfer

+0

Почему негативный взгляд? Когда регулярное выражение совпадает с G, которое следует за GGG, оно распознается как GGGG, за которым должен следовать [ATC]. Если за GGG следует AG, регулярное выражение работает. – Zipfer

+0

Правильно, работает. Когда я добавляю?! к G {3} и в то же время использовать модификатор/i, регулярное выражение не соответствует 'gaggaaagggaaagggaaaggg'. Но когда я сопоставляю '([gG] {3} [aAcCgGtT] ...' regex больше не распознает 'gaggaaaggg ...'. – Zipfer