我正在尝试解析samtools mpileup的文本输出。我以字符串
开头s = '.$......+2AG.+2AG.+2AGGG'
每当我有+
后跟一个整数n
时,我想在该整数后面选择n个字符并用*
替换整个事物。所以对于这个测试用例,我会有
'.$......+2AG.+2AG.+2AGGG' ---> '.$......*.*.*GG'
我有正则表达式\+[0-9]+[ACGTNacgtn]+
,但这导致输出.$......*.*.*
,并且尾随的G也会丢失。如何选择n个字符,其中n未提前知道但在字符串本身中指定?
答案 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)