是否可以使用反向引用来指定正则表达式中的复制数?

时间:2010-04-02 21:57:37

标签: python regex

是否可以使用反向引用来指定正则表达式中的复制数?

foo ='ADCKAL + 2AG。+ 2AG。+ 2AG。+ 2AGGG + .G + 3AGGa。'

以“+ [0-9]”开头,后跟“[A-z] { n }”的子字符串。需要简单地用'+'替换,其中变量 n 是子字符串中较早的数字。那个 n 可以被反向引用吗?例如(不起作用)'+([0-9])[A-z] {/ 1}。'是我想用“+”替换的模式(最后一个点可以是任何字符并代表质量得分),因此foo应该出现给ADCKAL +++ G.G +。

 import re
 foo = 'ADCKAL+2AG.+2AG.+2AG.+2AGGG+.+G+3AGGa.'
 indelpatt = re.compile('\+([0-9])')
 while indelpatt.search(foo):
     indelsize=int(indelpatt.search(foo).group(1))
     new_regex = '\+%s[ACGTNacgtn]{%s}.' % (indelsize,indelsize)
     newpatt=re.compile(new_regex)
     foo = newpatt.sub("+", foo)

我可能错过了一种解析字符串的简单方法。

1 个答案:

答案 0 :(得分:1)

不,您不能将反向引用用作量词。解决方法是构造一个正则表达式,可以处理交替中的每个案例。

import re

foo = 'ADCKAL+2AG.+2AG.+2AG.+2AGGG^+.+G+3AGGa4.'
pattern = '|'.join('\+%s[ACGTNacgtn]{%s}.' % (i, i) for i in range(1, 10))
regex = re.compile(pattern)
foo = regex.sub("+", foo)
print foo

结果:

ADCKAL++++G^+.+G+4.

另请注意,您的代码包含一个错误,导致它在您输入的输入上输入无限循环。