在正则表达式中查找正则表达式(Python 3.5)

时间:2016-12-14 19:25:11

标签: python regex python-3.x

我正在写一个脚本,它返回DNA序列(带有模糊字母)是否包含某个子序列(也带有模糊字母)。

我已经尝试为序列和子序列创建正则表达式,但我还没有找到一种方法来查找后者是否发生在前者中。我需要像re.search(substring,sequence)这样的东西 但sequence是另一个正则表达式而不是字符串。

这样的事情存在吗?

编辑:我尝试了什么:

import re

def subseqof(substr,sequence):
    substr_exp = ''
    sequence_exp = ''
    for letter in substr:
        for code,expr in zip(['A','C','G','T','R','Y','S','W','K','M','B','D','H','V','N','X'],
                           ['A','C','G','T','[AG]','[CT]','[GC]','[AT]','[GT]','[AC]','[CGT]','[AGT]','[ACT]','[ACG]','[ACGT]','[ACGT]']):
            if letter == code:
                substr_exp += expr
    for letter in sequence:
        for code,expr in zip(['A','C','G','T','R','Y','S','W','K','M','B','D','H','V','N','X'],
                           ['A','C','G','T','[AG]','[CT]','[GC]','[AT]','[GT]','[AC]','[CGT]','[AGT]','[ACT]','[ACG]','[ACGT]','[ACGT]']):
            if letter == code:
                sequence_exp += expr
    if re.search(substr_exp,sequence_exp) != None:
        return True
    else:
        return False

1 个答案:

答案 0 :(得分:0)

  

我需要类似re.search(substring,sequence)的东西   但是sequence是另一个正则表达式而不是字符串。

如果我理解正确,那么您想要e。 G。 subseqof(substr='RR', sequence='...AA...')以及subseqof(substr='AA', sequence='...RR...')return True(在两种情况下,R[AG]替换)。

  

这样的东西存在吗?

这种对称或可交换的正则表达式函数不存在。但是,由于这里仅使用一小部分正则表达式功能,因此我们可以轻松编写适当的功能:

iupac = dict(zip(['A','C','G','T', 'R', 'Y', 'S', 'W', 'K', 'M',  'B',  'D',  'H',  'V',   'N',   'X'],
                 ['A','C','G','T','AG','CT','GC','AT','GT','AC','CGT','AGT','ACT','ACG','ACGT','ACGT']))

def subseqof(substr, sequence):
    substr_exp   = list(map(iupac.get, substr))   # list of letters represented
    sequence_exp = list(map(iupac.get, sequence)) # list of letters represented
    for start in range(len(sequence_exp)-len(substr_exp)+1):    # sequence loop
        for subpos, sub in enumerate(substr_exp):           # sub-sequence loop
            if not sequence_exp[start+subpos]: break    # if letter not in dict
            if not re.search('['+sub+']', sequence_exp[start+subpos]): break
        else: return start                          # whole subsequence matched