Python 正则表达式匹配字符串中指定长度的单词
我正在尝试解析samtools mpileup的文本输出。我从一根绳子开始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不是
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'
谢谢,这是一个很好的建议。非常有帮助!