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

都是一行,我有很多类似序列的重复。

4

1 回答 1

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 之间的一位数字,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 回答