简体   繁体   English

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

[英]Find regular expression in regular expression (Python 3.5)

I'm writing a script that returns whether or not a DNA sequence (with ambiguous letters) contains a certain subsequence (also with ambiguous letters). 我正在编写一个脚本,该脚本返回一个DNA序列(带有歧义字母)是否包含某个子序列(也带有歧义字母)。

I've tried creating a regular expression for both the sequence and the subsequence, but I haven't found a way to find if the latter occurs in the former. 我尝试为序列和子序列创建一个正则表达式,但是我没有找到一种方法来查找后者是否出现在前者中。 I need something like re.search(substring,sequence) but where sequence is another regular expression instead of a string. 我需要类似re.search(substring,sequence)东西re.search(substring,sequence)但其中sequence是另一个正则表达式而不是字符串。

Does such a thing exist? 这样的事情存在吗?

Edit: what I've tried: 编辑:我已经尝试过:

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

I need something like re.search(substring,sequence) but where sequence is another regular expression instead of a string. 我需要类似re.search(substring,sequence)东西re.search(substring,sequence)但其中sequence是另一个正则表达式而不是字符串。

If I understand correctly, you want eg subseqof(substr='RR', sequence='...AA...') as well as subseqof(substr='AA', sequence='...RR...') to return True (where in both cases R is replaced with [AG] ). 如果我理解正确,则需要例如subseqof(substr='RR', sequence='...AA...')以及subseqof(substr='AA', sequence='...RR...')return True (在两种情况下, R均替换为[AG] )。

Does such a thing exist? 这样的事情存在吗?

Such a symmetric or commutative regular expression function doesn't exist. 这样的对称或可交换正则表达式函数不存在。 But as only a small subset of regex functionality is used here, we can easily write a proper function: 但是由于这里仅使用一小部分正则表达式功能,因此我们可以轻松编写适当的功能:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM