Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以使用back引用指定正则表达式中的复制数?_Python_Regex - Fatal编程技术网

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

Python 是否可以使用back引用指定正则表达式中的复制数?,python,regex,Python,Regex,是否可以使用back引用指定正则表达式中的复制数 foo='ADCKAL+2AG.+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 = 'ADCK

是否可以使用back引用指定正则表达式中的复制数

foo='ADCKAL+2AG.+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)

我可能缺少一种更简单的方法来解析字符串。

不,不能将反向引用用作量词。一种解决方法是构造一个正则表达式,它可以交替处理每种情况

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.

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

是否应该将
2AGGG^
设置为
4AGGG^
?对此深表歉意,我更改了输入字符串,以消除一些需要从示例中解析出来的其他内容。我原来的帖子包含“foo=”ADCKAL+2AG.+2AG.+2AG.+2AGGG^+.+G+3AGGa4.”,可以解析为“ADCKAL+++++G^+.+G+4.”,但是while循环仍然返回true,因为末尾有新的+4!仅供参考,如果
[A-z]
不是打字错误,那么几乎肯定是错误。如果您想匹配任何大写或小写ASCII字母,
[A-Za-z]
就是您想要的。谢谢!您的解决方案非常有效。我将更改示例代码,尝试编辑一些附加信息。很抱歉。