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

2024-09-23 20:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本,返回一个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

Tags: inreforsearchif字母code序列
1条回答
网友
1楼 · 发布于 2024-09-23 20:25:57

I need something like re.search(substring,sequence) but where sequence is another regular expression instead of a string.

如果我理解正确,您需要例如subseqof(substr='RR', sequence='...AA...')以及subseqof(substr='AA', sequence='...RR...')return True(在这两种情况下R都被[AG]替换)。你知道吗

Does such a thing exist?

这样的对称或交换正则表达式函数是不存在的。但由于这里只使用了正则表达式功能的一小部分,我们可以很容易地编写一个适当的函数:

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

相关问题 更多 >