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