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

それはすべて1行であり、同様のシーケンスの繰り返しがたくさんあります.

4

1 に答える 1

2

数字を一致させるだけです:

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

\d0 ~ 9 の文字に{1,3}一致し、そのうちの 1 ~ 3 文字に一致します。

SRR200 を超える数字で始まり、その後に続くものと一致させたくない場合は、より厳密な式を作成できます。

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

1 から 9 までの 1 桁の数字、10 から 99 までの 2 桁の数字 100 から 199 までの 3 桁の数字、または数字200 に一致します。

これらの式のいずれも、一致の後にさらに数字が続くことを妨げません。\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)
于 2013-07-02T20:15:06.483 に答える