Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 避免大型IUPAC模糊DNA搜索中的正则表达式溢出错误_Python_Regex_Bioinformatics_Biopython - Fatal编程技术网

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

Python 避免大型IUPAC模糊DNA搜索中的正则表达式溢出错误,python,regex,bioinformatics,biopython,Python,Regex,Bioinformatics,Biopython,我正在同一个装配体的染色体(大约10秒Mb)内寻找支架(大约10秒Kb)。两者都包含IUPAC歧义。到目前为止,我一直在使用 from Bio.SeqUtils import * nt_search(chromosome, scaffold) 然而,有一个实例,其中正向串搜索很好,但反向补码的搜索会产生正则表达式重载错误 from Bio.Seq import Seq from Bio.SeqUtils import * def findCoordinates (self): '''

我正在同一个装配体的染色体(大约10秒Mb)内寻找支架(大约10秒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
回溯(最近一次呼叫最后一次):
文件“scaffoldPlacer.py”,第98行,在
z、 findCoordinates()
文件“scaffoldPlacer.py”,第60行,在findCoordinates中
nt_reverse=nt_搜索(自身染色体[染色体],str(反向顺序))
文件“/usr/local/lib/python2.7/site packages/Bio/sekutils/_init__.py”,第191行,在nt_搜索中
m=重新搜索(模式,s)
文件“/usr/local/lib/python2.7/re.py”,第142行,搜索中
返回编译(模式、标志)。搜索(字符串)
文件“/usr/local/lib/python2.7/re.py”,第243行,在编译中
p=sre_compile.compile(模式、标志)
文件“/usr/local/lib/python2.7/sre_compile.py”,第523行,在compile中
组索引,索引组
溢出错误:超出了正则表达式代码大小限制
正如我前面提到的,只有在搜索反向补码正则表达式时才会发生此错误,因此前向搜索不会出错

有没有办法避免这个错误,或者有没有更好的办法来执行有关IUPAC歧义的DNA字符串搜索

谢谢

在这()之后,似乎巨大的模式破坏了重新编译。我使用的是x64 Linux,即使使用
re.compile(“x”*5000000)
,我也无法“打破”这个
re.compile
,而对于链接问题的讨论者声称它与65536中断,这与您的10Ks查询一致

你能尝试使用另一台计算机或操作系统吗

或者,您可以将查询一分为二(或者使用上述代码检查最大查询大小),然后检查匹配的坐标是否“连续”,并在代码中添加一些行

编辑。我发现了一个错误重现的系统。在文件
python2.7/sre_compile.py
的开头,您将看到以下几行(python 2.7.0):


其中,
\u sre
是一个内置文件(一个C文件)。如果您的python版本是使用
\u sre.c
编译的,它将正则表达式的大小限制为65535,并且
CODESIZE==2
,那么您必须升级python解释器。

您能给出一些示例数据以便我们重现错误吗?不幸的是,这些数据是专有的。我可以告诉你有问题的脚手架的长度,尽管我不确定这有多大帮助,因为除了长度之外,这个错误似乎是由于正则表达式的内容造成的。正如MattDMo所说,没有任何顺序,这太难调试了。为反向补语创建Seq时,请尝试设置IUPAC模糊字母表:
s=Seq(self.scaffolds[scaffold],IUPACAmbiguuUSDNA())
,但这是一个盲镜头。我不能用90.000 bp的随机序列作为查询,1.000.000 bp作为主题重现你的错误。是的,我理解。我问题的最后一部分怎么样?除了nt_搜索之外,我还可以使用其他工具来执行类似的功能吗?这个错误出现在x64 linux操作系统上。有趣的是,当我在本地x64 iOS上运行时,我没有收到任何错误。我在linux机器上运行Python2.7,但在本地机器上运行Python3。python版本的差异是否有责任?
if _sre.CODESIZE == 2:
    MAXCODE = 65535
else:
    MAXCODE = 0xFFFFFFFFL