从大型IUPAC模糊DNA搜索中避免正则表达式溢出错误

时间:2014-11-24 20:05:33

标签: python regex bioinformatics biopython

我正在寻找来自同一组装的染色体(大约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字符串搜索。

谢谢

1 个答案:

答案 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解释器。