我正在尝试解析samtools mpileup的文本输出。我从字符串开始
s = '.$......+2AG.+2AG.+2AGGG'
每当我有一个+
后跟一个整数n
时,我想在该整数后面选择 n 个字符并将整个字符替换为 *
。所以对于这个测试用例,我会有
'.$......+2AG.+2AG.+2AGGG' ---> '.$......*.*.*GG'
我有正则表达式+[0-9]+[ACGTNacgtn]+
但这会导致输出.$......*.*.*
并且尾随的 G 也会丢失。如何选择 n 个字符,其中 n 不是提前知道的,但在字符串本身中指定?
re.sub
中的repl
参数可以是字符串或函数。
因此,您可以使用函数替换执行非常复杂的事情:
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'
不是最优雅的,但我在运行re.sub
之前使用 re.findall
拉出了数值。
ls=re.findall('+(d)',s)
for i in ls:
s=re.sub('+(%sw{%s})' % (i,i),'*',s)