Python正则表达式来匹配和删除堆积形式的索引

2024-10-02 18:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Mpileup regex command to remove indels

输入: chr8 30 T 6…,$.$.$A,…A…,,,,,…+5AGGC…-8GTCGG……,A,^F,^].^F

我想删除可能类似于+5AGGC和{}的索引

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

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

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

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

Tags: toreseqcommand帖子removeregexindels
3条回答

这个终于奏效了

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

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

可能有助于某人谁正在寻找正则表达式删除索引从他们的堆积文件。在

This one worked finally

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

当然,这是错的。考虑:

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

贪婪的^{会吃掉所有的基,而不仅仅是堆积符号所说的五个。如果您有一个质量分数字符串,您可以验证这一点,因为在删除索引和其他工件后,这两个字符串的长度将不一致。从概念上讲,我们想要的模式是:

^{pr2}$

但是regex语法不允许我们将变量放在重复运算符的一般形式中,即{5}可以,但不能使用反向引用{\1}。在

有几种方法可以做到这一点,主要涉及两个步骤:第一,通过计数匹配初始部分;第二,使用该计数完成工作。下面是一个例子:

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)

匹配符号和计数,提取计数。然后从字符串中剪切匹配本身加上count个字符。重复,直到找不到更多索引。在

输出

...,$.$.$A,..A...,,,.,,...A..T......,a,^F,^].^F,

另一种方法是使用第一个模式匹配的结果动态地创建第二个模式,您可以将其传递给re.sub(),依次删除每个索引。在

您只需使用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,

相关问题 更多 >