我正在尝试删除以SRR开头的字符串,并以'length =使用不同长度的不同数字'结束。我所知道的这个数字是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
这一切都是一行,我有很多类似序列的重复。
答案 0 :(得分: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)