2011-12-07 3 views
1

파일에서 DNA 정보를 추출하려고합니다. 기본 GCAT로 구성된 DNA 데이터 앞에 ORIGIN이라는 단어가 있고 그 뒤에 //이 있습니다. 이 마커 사이에 이러한 기지를 얻기 위해 정규 표현식을 작성하려면 어떻게해야합니까?Regex : 두 마커 사이의 DNA 정보 추출

다음을 시도했지만 작동하지 않습니다.

[ORIGIN(GCATgcat)////] 

샘플 데이터 :

ORIGIN  
    1 acagatgaag acagatgaag acagatgaag acagatgaag 
    2 acagatgaag acagatgaag acagatgaag acagatgaag 
// 
+1

입력 문자열과 예상 출력을 제공 할 수 있습니까? – stema

+0

그냥 해냈어 :) – user1044585

+1

에서 읽는 파일에서 샘플을 추가하십시오. 라이프 폼을 구문 분석하는 정규식을 사용하지 마십시오 :) –

답변

1

것은 그래서에 포함하는 문자와 일치하지 않을 (단어 경계로 둘러싸인 (대문자 또는 소문자) 어떤 GCAT 문자 순서에 일치하는이 패턴 "\\b([GCATgcat]+)\\b"를보십시오 "카탈로그"와 같은 다른 문자열). 샘플 파일에서이 정규식을 반복적으로 스캔하면 각 시퀀스가 ​​추출됩니다.

여기 샘플 파일에 대한 작업 예제 : 정규식 슈퍼 마법사 아닌 사람들 우리 모두

// Locate the substring between "ORIGIN" and "//" in the file. 
String fileContents = getSampleFileContents(); 
int indexOfOrigin = fileContents.indexOf("ORIGIN"); 
String pertinentSection = fileContents.substring(
    indexOfOrigin, fileContents.indexOf("//", indexOfOrigin)); 

// Search for sequences within the pertinent substring. 
Pattern p = Pattern.compile("\\b([GCATgcat]+)\\b"); 
Matcher m = p.matcher(pertinentSection); 
List<String> sequences = new ArrayList<String>(); 
while (m.find()) { 
    sequences.add(m.group(1)); 
} 
sequences.toString(); // => ["acagatgaag", "acagatgaag", ..., "acagatgaag"] 
+0

알았어.하지만 여전히 작동하지 않는다. 원점과 데이터, 그리고 데이터 사이에 새로운 줄이 있다면 // 중요 할까? – user1044585

+0

@ user1044585 : 예, 공백 및 줄 바꿈을 포함하여 일치하는 문자열의 모든 문자가 정규식에 영향을 미칩니다. 문제의 요점이기 때문에 정확히 일부 샘플 데이터 문자열로 질문을 업데이트하십시오. – maerics

+0

오케이 난 그냥 내 질문을 편집 – user1044585

0

, 나는 두 단계 접근 방식을 제안 것입니다. 숫자와 줄 바꿈과 같은 명백한 거칠기를 제거한 다음 일치 항목을 수행하십시오. 예 :

public class Regex { 

    static String NL = "\n"; 
    static String INPUT = "stuff at beginning ORIGIN" + NL + 
    "1 acagatgaag acagatgaag acagatgaag acagatgaag" + NL + NL + 
    "2 acagatgaag acagatgaag acagatgaag acagatgaag" + NL + 
    "// I added stuff here at the end that should be ignored"; 

    public static void main(String[] args) { 
     Pattern removePattern = Pattern.compile("[\\r\\n \\t\\d]+"); 
     Pattern findPattern = Pattern.compile("ORIGIN[GCATgcat]+//"); 

     Matcher removeMatcher = removePattern.matcher(INPUT); 
     String clean = removeMatcher.replaceAll(""); 

     Matcher findMatcher = findPattern.matcher(clean); 
     if (findMatcher.find()) { 
     System.out.println(findMatcher.group()); 
     } 
    } 
} 
+0

p.s. - RNA를 커버 할 수있는 가능한 염기에 'U'와 'u'를 추가 할 수 있습니다. – user949300

+0

이것은 파일에서 내 데이터를 읽는 것과 같은 이상적인 솔루션은 아닙니다. 하지만 고마워요 – user1044585

+0

데모 코드 어딘가에서 String을 가져와야합니다. 분명히 실제 코드의 파일에서 읽었을 것입니다. 당신이 받아 들인 코드는 단지 String을 사용합니다! 이 코드는 오류에보다 강력합니다. 파일에 "ORIGIN"이 없으면 @maerics 코드가 폭발합니다. 또한, 사소한 일 (잠시 루프) 내 코드는 파일에서 여러 시퀀스를 찾을 수 있습니다. 많은 DNA 데이터베이스 파일에는 두 개 이상의 시퀀스가 ​​들어 있습니다. – user949300