2016-12-10 5 views
2

적어도 네 개의 G- 반복을 일치 시키려고합니다. 각 반복은 최대 7 자로 구분됩니다. 예 :Perl 정규식이 반복되는 문자열이 일치하지 않음

AAGGGAAGGGAAAGGGAAGGGAA 

대/소문자와 일치해야하는 정규 표현식을 사용합니다.

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

적어도 4 개의 G 반복과 일치해야합니다.

aaagaggaaaaggggaaaaggggaaaaggggaaa 

이 순서의 첫 번째 반복은으로 구분 세 GS를 포함한다 : 문제는 그 다음 순서와 일치 할 때 나는 긍정적 인 히트를 얻을 것이다. 따라서이 순서는 일치하지 않아야합니다.

해결 방법 1 : 문제가/i 수정자인 것으로 보입니다. 내가 정규식을 수정하여 해결할 수 있습니다 :

$sequence =~ /(([gG]{3,}[aAtTgGcC]{1,7}){3,}[gG]{3,})/g 

솔루션 2 ikegami에서 제공 : 부정적인 lookahead.

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

힌트 및 버그 신고를 제출해 주셔서 감사합니다.

+1

두 번째 시퀀스에서 (https://regex101.com/r/osA53E/1) 긍적 적중이 발생했습니다. –

+0

@Nicolas Maltais, OP는 PCRE가 아닌 Perl을 사용합니다. – ikegami

+0

적어도 4 개의 G를 일치 시키려면 수량 기호가 3에서 시작하는 이유는 무엇입니까? – shawnhcorey

답변

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에서 수정되었습니다.

+0

상호 연결 시퀀스가 ​​aaagaaa 일 수 있으므로 [ATGC]에 G가 필요합니다. – Zipfer

+0

왜 부정적인 선견자입니까? 정규 표현식이 GGG 다음에 나오는 G와 일치하면 GGGG로 인식되며 그 뒤에는 [ATC]가 와야합니다. GGG 다음에 AG가 오면 정규 표현식이 작동합니다. – Zipfer

+0

맞아요, 잘 작동합니다. 추가 할 때?! G {3}에 그리고 동시에/i 수정자를 사용하면 정규 표현식은'gaggaaagggaaagggaaaggg'와 일치하지 않습니다. 그러나'([gG] {3} [aAcCgGtT] ... '와 일치하면 정규 표현식은 더 이상'gaggaaaggg ... '를 인식하지 못합니다. – Zipfer