2

我正在尝试解析来自 samtools mpileup 的文本输出。我从一个字符串开始

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

每当我+后面有一个整数n时,我想选择该整数后面的 n 个字符并将整个内容替换为*. 所以对于这个测试用例,我会有

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

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

4

2 回答 2

1

in的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'
于 2015-04-24T20:21:21.697 回答
0

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

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

for i in ls:
    s=re.sub('\+(%s\w{%s})' % (i,i),'*',s)
于 2015-04-24T20:15:55.537 回答