使用Python中的正则表达式查找重叠匹配和子匹配

时间:2018-02-16 19:56:21

标签: regex python-3.4 string-matching dna-sequence

我有一串带有正则表达式的字符(DNA序列)我设计用于过滤掉可能的匹配(?:ATA|ATT)[ATCGN]{144,16563}(?:AGA|AGG|TAA|TAG)。后来我应用了两个过滤条件:

  1. 序列必须可被3,len(match) % 3 == 0
  2. 整除
  3. 在字符串结尾['AGA', 'AGG', 'TAA', 'TAG']之前必须没有终止密码子(not any(substring in list(sliced(match[:-3], 3)) for substring in [x.replace("U", "T") for x in stop_codons]))。
  4. 然而,当我应用这些过滤器时,我根本没有匹配(在过滤器之前我得到约200个匹配。我在整个序列中搜索子串的方式是运行re.findall(regex, genome_fasta, overlapped=True),因为匹配可以是其他匹配的子匹配。

    关于正则表达式,我有什么误解吗?据我所知,过滤后我还应该有匹配。

    如果还有其他需要添加的内容请告诉我! (我正在使用Python 3.4的regex包,而不是标准的re包,因为它没有重叠支持。)

    编辑1:

    每条评论:我正在寻找线粒体基因组中的ORFs,但只考虑长度至少为150个核苷酸(字符)的那些。考虑重叠很重要,因为匹配可能包括字符串中的第一个起始密码子和字符串中的最后一个终止密码子,但中间可能有另一个起始密码子。例如:

    • 鉴于“ATAAAGCCATTTACCGTACATAGCACATTATAACCAACAAACCTACCCACCCTTAACTAG”,匹配应为“ATAAAGCCATTTACCGTACATAGCACATTATAACCAACAAACCTACCCACCCTTAACTAG”,还应为“ATAAAGCCATTTACCGTACATAGCACATTATAA”,因为“TAG”和“TAA”均为终止密码子。

    编辑2:

    完全没有理解评论,方法的完整代码是:

    typical_regex = r"%s[ATCGN]{%s,%s}%s" % (proc_start_codons, str(minimum_orf_length - 6), str(maximum_orf_length - 6), proc_stop_codons)
    
    typical_fwd_matches = []
        if re.search(typical_regex, genome_fasta, overlapped=True):
            for match in re.findall(typical_regex, genome_fasta, overlapped=True):
                if len(match) % 3 == 0:
                    if not any(substring in list(sliced(match[:-3], 3)) for substring in [x.replace("U", "T") for x in stop_codons]):
                        typical_fwd_matches.append(match)
    
    print(typical_fwd_matches)
    

    typical_fwd_matches数组为空,当打印到控制台/文件时,正则表达式呈现为(?:ATA|ATT)[ATCGN]{144,16563}(?:AGA|AGG|TAA|TAG)

1 个答案:

答案 0 :(得分:1)

我认为你可以这样做。
子集将包括先前匹配的不断减小的大小 这就是你要做的所有事情 因此,设计正则表达式相当简单。

正则表达式只匹配3个字符的倍数 第1组捕获了开头和中间。
这用于新的 文本 值,这是最后一次匹配 减去最后3个字符。

正则表达式解释说:

 (                             # (1 start), Whole match minus last 3 chars
      (?: ATA | ATT )               # Starts with one of these 3 char sequence
      (?:                           # Cluster group
           [ATCGN]{3}                    # Any 3 char sequence consisting of these chars
      )+                            # End cluster, do 1 to many times
 )                             # (1 end)
 (?: AGA | AGG | TAA | TAG )   # Last 3 char sequence, one of these

Python代码示例:

Demo

import re

r = re.compile(r"((?:ATA|ATT)(?:[ATCGN]{3})+)(?:AGA|AGG|TAA|TAG)")
text = "ATAAAGCCATTTACCGTACATAGCACATTATAACCAACAAACCTACCCACCCTTAACTAG"

m = r.search(text)
while m:
    print("Found:  " + m.group(0))
    text = m.group(1)
    m = r.search(text)

输出:

Found:  ATAAAGCCATTTACCGTACATAGCACATTATAACCAACAAACCTACCCACCCTTAACTAG
Found:  ATAAAGCCATTTACCGTACATAGCACATTATAA
Found:  ATTTACCGTACATAG

使用此方法,正在测试的子集是:

ATAAAGCCATTTACCGTACATAGCACATTATAACCAACAAACCTACCCACCCTTAACTAG
ATAAAGCCATTTACCGTACATAGCACATTATAACCAACAAACCTACCCACCCTTAAC
ATAAAGCCATTTACCGTACATAGCACATTA
ATTTACCGTACA

我们可以对正则表达式匹配这些内容的时间进行基准测试。

Regex1:   ((?:ATA|ATT)(?:[ATCGN]{3})+)(?:AGA|AGG|TAA|TAG)
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   3
Elapsed Time:    1.63 s,   1627.59 ms,   1627594 µs
Matches per sec:   92,160