2013-07-02 2 views
2

SRR로 시작하는 문자열을 제거하고 '길이 = 다양한 길이의 다양한 숫자'로 끝내려고합니다. 이 번호에 대해 알고있는 것은 1에서 200까지 다양합니다 ...끝에 숫자가 다른 문자열을 제거하는 방법

나는 그것을 만드는 법을 모르며 어떤 방법이 가장 효율적인지는 알지 못합니다. 큰 파일 (> 10GB)을 조작하고 있습니다. 마지막에 가까운 물건까지

import os 
import re 
f2 = open(r'path') 
num = 0 
while num < 200: 
    num = num+1 
    ident2 = re.compile('SRR.*?%d' %num, re.DOTALL) 
    stuff = f2.read() 
    for line in f2: 
     ident2.sub('',stuff) 

코드는 더 이상 전체이지만, 그래 난 쓰기 않고 :

나는 테스트 할 200 일에서 모든 값에 대한 루프를하고 싶었다. 모든 숫자를 고려하여 문자열을 제거하는 식을 사용할 수 있는지 궁금합니다 ...

모든 제안과 건설적인 비평은 크게 감사하겠습니다.

나는 텍스트 imput의 샘플을 추가하고 :

@SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50TTGCCTGCCTATCATTTTAGTGCCTGTGAGGTGGAGATGTGAGGATCAGT+SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50hhhhhhhhhhghhghhhhhfhhhhhfffffe`ee[`X]b[d[ed`[Y[^Y 

그것은 모두 한 줄 내가 비슷한 시퀀스의 많은 반복이있다.

답변

2

그냥 일치하는 숫자 :

re.compile('SRR.*?\d{1,3}', re.DOTALL) 

\d는 0-9, 1, 그 중 3 사이 {1,3} 일치 일치합니다.

당신이 2 이상 (200) 다음에 다음 SRR와 함께 시작 아무것도 일치하지 않으려면, 당신은 더 까다 롭고 인 표현 만들 수 있습니다

re.compile('SRR.*?(?:[1-9]|[1-9]\d|1\d{2}|200)', re.DOTALL) 

는 한 자리 숫자를 일치를 1, 9, 또는 10 내지 99, 또는 사이의 2 자리 숫자는 100, 199, 또는 수 이들 식 200

없음 사이의 3 자리 숫자는 t 방지 그는 더 많은 자릿수가 뒤따른 것과 일치합니다. 내가 알고하지 않았다

re.compile('SRR.*?length=(?:[1-9]|[1-9]\d|1\d{2}|200)', re.DOTALL) 
+0

와우, 감사 : 내가 명시 적으로 length= 매개 변수를 포함 것, 당신의 게시 된 샘플에서

re.compile('SRR.*?\d{1,3}\b', re.DOTALL) 

: 당신은 표현의 끝에 \b 경계 앵커를 추가해야 할 수 있습니다 \ d 그런 식으로 사용할 수 있습니다. – Fabien

+0

re.compile ('^ SRR. *? [012} {1,2} \ d \ b $', re.DOTALL) – blackwind

+0

@blackwind : 숫자가 아닌 '000'패턴을 허용합니다. 그것은 일치해야만하는'199'를 허용하지 않습니다. –

관련 문제