Python 引用表达式早期部分的匹配项的正则表达式

Python 引用表达式早期部分的匹配项的正则表达式,python,regex,Python,Regex,我正在寻找一个正则表达式,它将标识一个序列,其中文本中的整数指定表达式末尾的尾随字母数。此特定示例适用于以pileup格式识别遗传数据中的插入和删除 例如: 如果我正在搜索的文本是: AtT+3ACGTTT-1AaTTa 我需要匹配插入和删除,在本例中是+3ACG和-1A。整数(n)部分可以是大于1的任何整数,我必须捕获n个尾随字符 我可以将单个插入或删除与[+-]?[0-9]+[ACGTNacgtn]匹配,但我不知道如何获取整数指定的尾随ACGTN的确切数量 我很抱歉,如果这里有一个明显的答

我正在寻找一个正则表达式,它将标识一个序列,其中文本中的整数指定表达式末尾的尾随字母数。此特定示例适用于以pileup格式识别遗传数据中的插入和删除

例如:

如果我正在搜索的文本是:

AtT+3ACGTTT-1AaTTa
我需要匹配插入和删除,在本例中是
+3ACG
-1A
。整数(n)部分可以是大于1的任何整数,我必须捕获n个尾随字符

我可以将单个插入或删除与
[+-]?[0-9]+[ACGTNacgtn]
匹配,但我不知道如何获取整数指定的尾随ACGTN的确切数量

我很抱歉,如果这里有一个明显的答案,我已经搜索了几个小时。谢谢

(更新)

我通常使用Python。我用python中的re模块找到的一个解决方法是调用每个in/del的整数和span,并将两者结合起来提取适当长度的文本

例如:

>>> import re
>>> a = 'ATTAA$At^&atAA-1A+1G+4ATCG'
>>> expr = '[+-]?([0-9]+)[ACGTNacgtn]'
>>> ints = re.findall(expr, a) #returns a list of the integers
>>> spans = [i.span() for i in re.finditer(expr,a)]
>>> newspans = [(spans[i][0],spans[i][1]+(int(indel[i])-1)) for i in range(len(spans))]
>>> newspans
>>> [(14, 17), (17, 20), (20, 26)]

得到的元组允许我切掉indel。可能不是最好的语法,但它可以工作

这不可能直接实现,正则表达式不能那样“计数”

但是,如果您使用的编程语言允许回调作为正则表达式匹配求值器(例如C#,PHP),那么您可以将正则表达式设置为
[+-]?([0-9]+([ACGTNacgtn]+)
,并在回调中将尾部字符修剪到所需的长度

e、 g代表C#

var regexMatches=new List();
Regex-theRegex=新的正则表达式(@“[+-]?([0-9]+)([ACGTNacgtn]+)”;
text=theRegex.Replace(文本,委托(匹配此匹配)
{
int numberOfInsertsOrDeletes=Convert.ToInt32(thisMatch.Groups[1].Value);
string trailingString=thisMatch.Groups[2]。值;
if(numberOfInsertsOrDeletes>trailingString.Length)
{trailingString=trailingString.Substring(0,numberOfInsertsOrDeletes);}
regexMatches.Add(trailingString);
返回thisMatch.Groups[0]。值;
});

您可以使用正则表达式替换传递函数作为替换。。。比如说

s = "abcde+3fghijkl-1mnopqr+12abcdefghijklmnoprstuvwxyz"

import re

def dump(match):
    start, end = match.span()
    print s[start:end + int(s[start+1:end])]

re.sub(r'[-+]\d+', dump, s)

#output
# +3fgh
# -1m
# +12abcdefghijkl

简单的Perl模式用于匹配一个整数,后跟任意字符数,如下所示:

 (\d+)(??{"." x $1})
这很直截了当,我想你会同意的。例如,此代码段:

my$string=“AtT+3ACGTTT-1AaTTa”;
打印“匹配的$&\n”,而$string=~m{
(\d+)#将整数捕获到$1中
(?{“.”x$1})把那么多的点插回图案中
}xg;
Merrily打印出预期的结果

匹配的3ACG
匹配1A
编辑 哦,糟了,我看到你刚刚添加了Python标记,因为我开始编辑。哎呀。嗯,也许这对你有帮助

也就是说,如果您实际寻找的是模糊匹配,其中允许一定数量的插入和删除(编辑距离),那么Matthew Barnett的Python
regex
库将处理该问题。这似乎不是您正在做的事情,因为插入和删除实际上是在字符串中表示的


但是Matthew的库非常好,非常有趣,它甚至做了许多Perl不能做的事情它是标准Python
re
库的替代品

这在正则表达式中是不可能的。“正则”表达式的某些实现允许这样做,但这将比在表达式之外执行计算更困难、更慢。谢谢mikel,你的回答让我思考了如何用python解决这个问题。我已经用我找到的解决方案更新了我的问题。
 (\d+)(??{"." x $1})