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

Python 正则表达式匹配字符串中指定长度的单词,python,regex,samtools,Python,Regex,Samtools,我正在尝试解析samtools mpileup的文本输出。我从一根绳子开始 s = '.$......+2AG.+2AG.+2AGGG' 每当我有一个+后跟一个整数n,我想在该整数后面选择n个字符,并用*替换整个内容。所以对于这个测试用例,我会 '.$......+2AG.+2AG.+2AGGG' ---> '.$......*.*.*GG' 我有正则表达式\+[0-9]+[ACGTNacgtn]+,但这会导致输出$..*.*.*.,并且后面的G也会丢失。如何选择n个字符,其中n不是

我正在尝试解析samtools mpileup的文本输出。我从一根绳子开始

s = '.$......+2AG.+2AG.+2AGGG'
每当我有一个
+
后跟一个整数
n
,我想在该整数后面选择n个字符,并用
*
替换整个内容。所以对于这个测试用例,我会

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

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

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

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

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

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

因此,您可以通过函数替换来完成非常复杂的工作:

def removechars(m):
x=m.组()
n=重新匹配(r'\+(\d+).*',x).组(1)\数字部分
返回'*'+x[1+len(n)+int(n):]
解决您的问题:

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

谢谢,这是一个很好的建议。非常有帮助!