Python正则表达式匹配并删除堆积格式的indel

时间:2016-05-27 20:24:14

标签: python regex

我的问题类似于以下帖子,但我需要这个python:

Mpileup regex command to remove indels

INPUT:     chr8 30 T 6 ...,$。$。$ A,.. A ... ,,,。,, ... + 5AGGC ......- 8GTCGG ......,a,^ F,^ ]。^ F,

我想删除与+5AGGC-8GTCGG

类似的插头

输出:     chr8 30 T 6 ...,$。$。$ A,.. A ... ,,, .... ,, .........,a,^ F,^]。^ F ,

我尝试使用以下正则表达式但不起作用,请帮助

= re.sub(" [+]?([0-9]+)([ACGTNacgtn]+)", "", seq)

= re.sub("-\d+[ACGT]+", "", seq)

3 个答案:

答案 0 :(得分:0)

这个终于工作了

sequence = re.sub(“+ \ d + [ACGT] +”,“”,序列)

sequence = re.sub(“ - \ d + [ACGT] +”,“”,序列)

对于那些正在寻找正则表达式从他们的堆积文件中删除indel的人来说,可能会有所帮助。

答案 1 :(得分:0)

  

这个终于工作了

     

sequence = re.sub(" + \ d + [ACGT] +","",sequence)

除了当然,这是错误的。考虑:

.....+5AGGCTA.....

{{1>} 贪婪 会吃 所有 的基础,而不仅仅是五个堆积符号表示是indels。如果您有质量得分字符串,则可以验证这一点,因为在删除indel和其他工件后,两个字符串的长度不一致。从概念上讲,我们想要的模式是:

[ACGT]+

但是正则表达式语法不允许我们将变量放在重复运算符的一般形式中,即r"[+-](\d+)[ACTG]{\1}" 很好但不是后引用{5}

有几种方法可以解决这个问题,主要涉及两个步骤:首先,通过计数匹配初始部分;第二,用这个数来完成这项工作。这是一个例子:

{\1}

匹配符号和计数,提取计数。然后剪切匹配本身加上字符串中的count个字符。重复,直到你再也找不到插入内容。

<强>输出

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)

另一种方法是使用第一个模式匹配的结果来动态创建第二个模式,您可以将其传递给...,$.$.$A,..A...,,,.,,...A..T......,a,^F,^].^F, 以依次删除每个插入内容。

答案 2 :(得分:0)

您可以使用re.compile('[-+]\d+[ACGTacgtNn]+')替换所有插曲:

>>> import re
>>> REOBJ_RM_INDEL = re.compile('[-+]\d+[ACGTacgtNn]+')
>>> bases="...,$.$.$A,..A...,,,.,,...+4AGGC...-5GTCGG......,a,^F,^].^F,"
>>> REOBJ_RM_INDEL.sub('', bases)
... ...,$.$.$A,..A...,,,.,,............,a,^F,^].^F,