正则表达式匹配字符串中指定长度的单词
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'
我正在尝试解析 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'