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

时间:2012-07-28 04:39:51

标签: python regex

我正在寻找一个正则表达式,它将识别一个序列,其中文本中的整数指定表达式末尾的尾随字母数。这个具体的例子适用于识别堆积格式中遗传数据的插入和删除。

例如:

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

AtT+3ACGTTT-1AaTTa

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

我可以使用[+-]?[0-9]+[ACGTNacgtn]匹配单个插入或删除,但我无法弄清楚如何获取整数指定的尾随ACGTN的确切数量。

如果这里有明显的答案我道歉,我一直在寻找几个小时。谢谢!

(UPDATE)

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

例如:

>>> 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)]

由此产生的元组允许我切出indels。可能不是最好的语法,但它有效!

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式替换传递函数作为替换...例如

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

答案 1 :(得分:0)

这不是直接可能的,正则表达式无法计算'像那样。

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

e.g。对于C#

var regexMatches = new List<string>();
Regex theRegex = new Regex(@"[+-]?([0-9]+)([ACGTNacgtn]+)");
text = theRegex.Replace(text, delegate(Match thisMatch)
{

    int numberOfInsertsOrDeletes = Convert.ToInt32(thisMatch.Groups[1].Value);
    string trailingString = thisMatch.Groups[2].Value;
    if (numberOfInsertsOrDeletes > trailingString.Length)
    { trailingString = trailingString.Substring(0, numberOfInsertsOrDeletes); }
    regexMatches.Add(trailingString);

    return thisMatch.Groups[0].Value;
});

答案 2 :(得分:0)

用于匹配整数后跟任意字符数的简单Perl模式只是:

 (\d+)(??{"." x $1})

这很直截了当,我想你会同意的。例如,此代码段:

my $string = "AtT+3ACGTTT-1AaTTa";

print "Matched $&\n" while $string =~ m{
    ( \d+ )            # capture an integer into $1
    (??{ "." x $1 })   # interpolate that many dots back into pattern
}xg;

快速打印出预期的

Matched 3ACG
Matched 1A

修改

哦,亲爱的,自从我开始编辑以来,我看到你刚刚添加了Python标签。哎呀。好吧,也许这对你有帮助。

也就是说,如果您实际需要的是模糊匹配,您允许进行一些插入和删除(编辑距离),那么Matthew Barnett的regex Python库将处理它。这似乎不是你正在做的事情,因为插入和删除实际上是在你的字符串中表示的。

但是马修的图书馆真的非常好而且非常有趣,它甚至做了许多Perl无法做到的事情。 :)它是标准Python re库的替代品。