正则表达式匹配字符串中指定的长度的单词

时间:2015-04-24 20:03:02

标签: python regex samtools

我正在尝试解析samtools mpileup的文本输出。我以字符串

开头
s = '.$......+2AG.+2AG.+2AGGG'

每当我有+后跟一个整数n时,我想在该整数后面选择n个字符并用*替换整个事物。所以对于这个测试用例,我会有

'.$......+2AG.+2AG.+2AGGG' ---> '.$......*.*.*GG' 

我有正则表达式\+[0-9]+[ACGTNacgtn]+,但这导致输出.$......*.*.*,并且尾随的G也会丢失。如何选择n个字符,其中n未提前知道但在字符串本身中指定?

2 个答案:

答案 0 :(得分:1)

repl中的re.sub参数可以是字符串或函数

所以,你可以用功能替换来做很复杂的事情:

def removechars(m):
    x=m.group()
    n=re.match(r'\+(\d+).*', x).group(1) # digit part
    return '*'+x[1+len(n)+int(n):]

解决您的问题:

>>> re.sub(r'\+[0-9]+[ACGTNacgtn]+', removechars, s)
'.$......*.*.*GG'

答案 1 :(得分:0)

不是最优雅,但在运行re.findall之前,我使用re.sub提取了数值。

ls=re.findall('\+(\d)',s)

for i in ls:
    s=re.sub('\+(%s\w{%s})' % (i,i),'*',s)
相关问题