擅长:python、mysql、java
<blockquote>
<p>This one worked finally</p>
<p>sequence = re.sub("+\d+[ACGT]+", "", sequence)</p>
</blockquote>
<p>当然,这是错的。考虑:</p>
<pre><code>.....+5AGGCTA.....
</code></pre>
<p>贪婪的^{<cd1>会吃掉所有的基,而不仅仅是堆积符号所说的五个。如果您有一个质量分数字符串,您可以验证这一点,因为在删除索引和其他工件后,这两个字符串的长度将不一致。从概念上讲,我们想要的模式是:</p>
^{pr2}$
<p>但是regex语法不允许我们将变量放在重复运算符的一般形式中,即<code>{5}</code>可以,但不能使用反向引用<code>{\1}</code>。在</p>
<p>有几种方法可以做到这一点,主要涉及两个步骤:第一,通过计数匹配初始部分;第二,使用该计数完成工作。下面是一个例子:</p>
<pre><code>import re
pileup = '...,$.$.$A,..A...,,,.,,...+5AGGCTA..-8GTCGGAAAT......,a,^F,^].^F,'
while True:
match = re.search(r"[+-](\d+)", pileup)
if match is None:
break
pileup = pileup[:match.start()] + pileup[match.end() + int(match.group(1)):]
print(pileup)
</code></pre>
<p>匹配符号和计数,提取计数。然后从字符串中剪切匹配本身加上count个字符。重复,直到找不到更多索引。在</p>
<p><strong>输出</strong></p>
<pre><code>...,$.$.$A,..A...,,,.,,...A..T......,a,^F,^].^F,
</code></pre>
<p>另一种方法是使用第一个模式匹配的结果动态地创建第二个模式,您可以将其传递给<code>re.sub()</code>,依次删除每个索引。在</p>