0

我面临以下问题,尚未找到解决方案:

我正在开发一种用于序列分析的工具,该工具使用带有参考序列的文件并尝试在测试序列中找到这些参考序列之一。

问题是测试序列可能包含间隙(例如:)ATG---TCA。我希望我的工具找到一个特定的参考序列作为测试序列的子串,即使参考序列被-测试序列中的间隙 ( ) 打断。

例如:

我的参考序列之一: a = TGTAACGAACGG

我的测试序列: b = ACCT**TGT--CGAA-GG**AGT

(参考序列中的相应部分以粗体给出)

我虽然关于正则表达式并试图自己努力,但如果我没有错,正则表达式只会反过来起作用。因此,我需要将间隙位置作为正则表达式包含到参考序列中,然后将其映射到测试序列中。但是,我不知道测试序列中间隙的位置、长度和数量。我的想法是-将测试序列字符串中的间隙位置(所以 all )交换为某种正则表达式或代表参考序列中任何其他字符的特殊字符。比我将未修改的参考序列与我修改的测试序列进行比较......不幸的是,我没有在 python 中找到一个用于字符串搜索的函数或一种可以做到这一点的正则表达式。

非常感谢!

4

2 回答 2

0

有好消息也有坏消息...

首先是坏消息:您尝试做的事情并不容易,而正则表达式确实不是做到这一点的方法。在一个简单的情况下,可以使正则表达式起作用(也许),但它效率低下并且无法扩展。

然而,好消息是这是生物信息学中很好理解的问题(例如,参见https://en.wikipedia.org/wiki/Sequence_alignment)。更好的消息是 Biopython 中有一些工具可以帮助你。例如http://biopython.org/DIST/docs/api/Bio.pairwise2-module.html

编辑 从下面的讨论中,您似乎在说“b”可能很长,但假设“a”仍然很短(在上面的示例中为 12 个碱基),我认为您可以通过迭代每 12-mer 来解决这个问题在'b'中。即,将“b”划分为 12 个碱基长的序列(显然,您最终会得到很多!)。然后,您可以轻松地比较这两个序列。如果您真的想使用正则表达式(我仍然建议您不要),那么您可以将“-”替换为“。” 并做一个简单的比赛。例如

import re

''' a is the reference '''
a = 'TGTAACGAACGG'

''' b is 12-mer taken from the seqence of interest, in reality you'll be  doing this test for every possible 12-mer in the sequence'''
b = 'TGT--CGAA-GG'

b = b.replace('-', '.')
r = re.compile(b);
m = r.match(a)

print(m)
于 2016-08-15T13:28:53.960 回答
0

你可以这样做:

import re

a = 'TGTAACGAACGG'
b = 'ACCTTGT--CGAA-GGAGT'

temp_b = re.sub(r'[\W_]+', '', b) #removes everything that isn't a number or letter

if a in temp_b:
    #do something
于 2016-08-15T13:23:08.543 回答