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

regex to match words of length specified within string

我正在尝试解析 samtools mpileup 的文本输出。我从字符串

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

每当我有一个 + 后跟一个整数 n 时,我想 select 该整数后面的 n 个字符并用 * 替换整个东西。所以对于这个测试用例,我会

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

我有正则表达式 \+[0-9]+[ACGTNacgtn]+ 但这导致输出 .$......*.*.* 并且尾随的 G 也丢失了。我如何 select 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.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'