2012-11-29 7 views
1

정규식에 약간 문제가 있습니다. 저는 다음과 같은 것을 가지고 있습니다 : (A|C|G|T){3} A, B, C, D의 세 문자의 모든 순열을 제공하지만 이제는 세 가지 특정 패턴, 즉 "TAG", "TAA""TGA"을 제외하고 싶습니다. [^]으로 시도했지만 예상 결과를 얻을 수 없습니다. look-around (앞을보고 뒤에서 바라보고 있음)을 사용하는 경우에도 마찬가지입니다.펄에서 regex에서 특정 패턴을 제외하는 방법은 무엇입니까?

"ATG"로 시작하고 "TAG", "TAA"또는 "TGA"로 끝나는 모든 하위 문자열을 찾아 중간에 A, C의 세자리가 있어야합니다 , G 또는 T.

도움을 주셔서 감사합니다! 여기

내가 지금까지 무엇을했는지이다 : 당신이하지 말았어야 귀하의 경우

(ATG)((((A|C|G|T)){3})[^TAG][^TAA][^TGA])*(TAG|TAA|TGA) 

(ATG)((?!TAG)(?!TAA)(?!TGA)(((A|C|G|T)){3})*)(TAG|TAA|TGA) 
+1

올바른지 여부 : 'ATGCCTAGCTAA'? 즉, 특정 트리플렛을 제외하고 여러개의 트리플렛을 찾고 있습니까? 아니면 예외가 부분 문자열이 아닌 곳에 3으로 나눌 수있는 길이의 문자열을 찾고 있습니까? – pmakholm

답변

5

내가 제대로 이해한다면 :

1)의 'TGA'

3) 하나의 'TAG', 'TAA'를 제외하고 ATG

2) 세 쌍둥이의 숫자로 시작하고 삼중 'TAG', 'TAA', 또는 'TGA'는

이 작동합니다 :

/ 
    (ATG)      # Step 1 
    ((?!TAG|TAA|TGA)[ACGT]{3})+ # Step 2 
    (TAG|TAA|TGA)    # Step 3 
/x 

의 차이 두 번째 아이디어는 한정어 안의 음수 앞을 앞뒤로 움직여 여러 쌍의 중 어느 것도 두 예외 중 하나가되지 않도록 보장합니다.

이 솔루션은 다음과 같은 요소간에 공통점이 있다고 가정하지 않습니다. 2 단계 및 3 단계를 더 간단한,하지만 귀하의 경우와 동등한에서, 공식은 다음과 같습니다

1) 일치 'ATG'

2) 쌍둥이

3)의 수를 일치 ...'TAG', 'TAA', 'TGA'와 일치 할 때까지

이렇게하려면 2 단계의 한정 기호를 비 욕심으로 만드십시오. 그러면 2 단계가 다시 일치하는지 확인하기 전에 3 단계가 일치하는지 테스트하게됩니다.

/ (ATG) ([ACGT]{3})*? (TAG|TAA|TGA) /x 

는 또 다른 해석이있을 수 있습니다 : 같은

그런 다음 솔루션은 보일 것이다

1) ATG

2) 세 쌍둥이의 숫자로 시작

3) 1 'TAG', 'TAA', 'TGA'의 세 쌍 중 하나임

4) 하위 문자열 2 단계에서 'TAG', 'TAA', 'TGA'하위 문자열을 포함 할 수 없습니다.

이 경우 두 개의 정규 표현식을 사용하여 문제를 해결할 것입니다. 1-3 단계를 구현하고 4 단계에서 하나의 테스트를 수행하는 경우 :

$sequence =~ /(ATG)([ACGT]{3})(TAG|TAA|TGA)/ and $2 !~ /TAG|TAA|TGA/; 
+0

네가 부정적인 선견지명에'[ACGT]'를 포함 시켰기 때문에 그건 작동하지 않을 것이다. 여기를 참고하십시오 : http://rubular.com/r/ISc65tpRez –

+0

@Asad : 최종'$ '를 추가하면 작동합니다. – choroba

+1

아니요. 부정적인 look-ahead는'(?! TAG | TAA | TGA)' – pmakholm

0

가 중간에 아무것도 제외해야 할 - 당신이 가장 긴 시퀀스가 ​​일치 할 가정. Perl의 *+은 이미 그렇게합니다 : 그들은 욕심 많고 가능한 가장 긴 순서와 일치합니다. 간단한 예

그래서 입력 ABAACAAC이며 다음 m/A[ABC]*C/ 이미 BAACAAC뿐 아니라 BAAC을 일치합니다 중간에 A, B 또는 C에서 모든 것을 C로 끝나는 B로 시작하는 모든 것을 일치합니다. (제로 폭 부정적인보기 미리보기/숨김 주장과 같은 것들이 있지만)

일반적으로 당신은 중간에 아주 잘 특정 일을 제외하기 위해 정규 표현식을 사용할 수 없습니다.

편집 : "끝 패턴"이 처음 나타나는 위치에서 일치를 중지하려면 ?으로 접미사를 붙여 간단히 *으로 지정합니다. non-greedyness를 가진 나의 예 : m/A[ABC]*?C/.이 경우에는 char 클래스에서 C을 생략 할 수도 있지만 (이 단순화 된 예제에서는 단 하나의 문자이기 때문에).

관련 문제