2013-07-02 40 views
2

我想要移除以SRR開頭並以'長度=可變長度的數字'結束的字符串。我所知道的這個數字是它在1和200之間變化的...如何在末尾使用不同的數字來移除字符串

我不知道如何製作它,也不知道什麼方式是最有效的。我正在操縱大文件(> 10GB)。

我想要做的所有值的循環,從1到200進行測試:

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) 

的代碼是整體更長的時間,但是是我做的寫入和關閉的東西了底。我只是想知道如果我可以使用一個表達式,將需要考慮每個數字,並刪除字符串...

任何建議,並建設性的批評將不勝感激。

我加入文字稱輸入樣本:

@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場比賽之間的匹配。

如果你不想匹配任何與SRR,然後後面跟一個數字高於200開始,你可以創建一個表達式,它是比較挑剔:

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

匹配一個一位數字1和9,之間100和199,或數目這些表達式的200

無之間的3位數字10和99,或之間一個2位數防止噸他匹配後面跟着更多的數字。您可能需要將\b邊界錨添加到表達式的末尾:

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

爲您發佈的樣品,我會明確地包括length=參數:

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

哇,謝謝,我不知道你可以這樣使用\ d。 – Fabien

+0

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

+0

@blackwind:它允許模式000',它根本不是數字。它不允許199應該匹配。 –