我正在寻找一个正则表达式,它将识别一个序列,其中文本中的整数指定表达式末尾的尾随字母数。这个具体的例子适用于识别堆积格式中遗传数据的插入和删除。
例如:
如果我正在搜索的文字是:
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。可能不是最好的语法,但它有效!
答案 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
库的替代品。