我正在寻找来自同一组装的染色体(大约10s Mb)内的支架(大约10s的Kb)。两者都包含IUPAC歧义。到目前为止我一直在使用
from Bio.SeqUtils import *
nt_search(chromosome, scaffold)
但是,有一个实例,正向链搜索很好,但搜索其反向补码会产生正则表达式重载错误。
from Bio.Seq import Seq
from Bio.SeqUtils import *
def findCoordinates (self):
''' Performs scaffold string search within chromosomes. Returns scaffold coordinates within said chromosome. '''
for chromosome in self.chromosomes.keys():
for scaffold in self.scaffolds.keys():
# search forward strand.
nt_forward = nt_search(self.chromosomes[chromosome], self.scaffolds[scaffold])
if len(nt_forward) > 1:
startCoord = nt_forward[1] + 1
endCoord = (startCoord + len(self.scaffolds[scaffold]))
# save coordinates
else: # search reverse strand
scaffold_seq = Seq(self.scaffolds[scaffold])
reverse_seq = scaffold_seq.reverse_complement()
nt_reverse = nt_search(self.chromosomes[chromosome], str(reverse_seq))
if len(nt_reverse) > 1:
startCoord = nt_reverse[1] + 1
endCoord = (startCoord + len(self.scaffolds[scaffold]))
# save coordinates
self.scaffolds[scaffold] = str(scaffold_seq.reverse_complement())
我收到以下错误:
Traceback (most recent call last):
File "scaffoldPlacer.py", line 98, in <module>
z.findCoordinates()
File "scaffoldPlacer.py", line 60, in findCoordinates
nt_reverse = nt_search(self.chromosomes[chromosome], str(reverse_seq))
File "/usr/local/lib/python2.7/site-packages/Bio/SeqUtils/__init__.py", line 191, in nt_search
m = re.search(pattern, s)
File "/usr/local/lib/python2.7/re.py", line 142, in search
return _compile(pattern, flags).search(string)
File "/usr/local/lib/python2.7/re.py", line 243, in _compile
p = sre_compile.compile(pattern, flags)
File "/usr/local/lib/python2.7/sre_compile.py", line 523, in compile
groupindex, indexgroup
OverflowError: regular expression code size limit exceeded
正如我之前提到的,只有在搜索反向补码正则表达式时才会出现此错误,因此前向定位搜索完成且没有错误。
有没有办法避免这个错误,或者有更好的方法来执行关于IUPAC歧义的DNA字符串搜索。
谢谢
答案 0 :(得分:1)
在此之后(Python's Regular Expression Source String Length),似乎巨大的模式打破了re.compile。我在x64 Linux上,即使用re.compile
我也无法“打破”re.compile("x"*5000000)
,而关联问题的评论者声称它打破了65536,与你的10K查询一致。
您可以尝试使用其他计算机或操作系统吗?
或许您可以将查询分成两部分(或使用上面的代码检查最大查询大小),然后检查匹配的坐标是否“连续”,在代码中添加一些行。
编辑。我找到了一个错误再现的系统。在开头的文件python2.7/sre_compile.py
中,您将找到这一行(python 2.7.0):
if _sre.CODESIZE == 2:
MAXCODE = 65535
else:
MAXCODE = 0xFFFFFFFFL
其中_sre
是内置(C文件)。如果您的python版本使用_sre.c
进行编译,将正则表达式的大小限制为65535且CODESIZE == 2
,则必须升级python解释器。