[英]Find regular expression in regular expression (Python 3.5)
我正在编写一个脚本,该脚本返回一个DNA序列(带有歧义字母)是否包含某个子序列(也带有歧义字母)。
我尝试为序列和子序列创建一个正则表达式,但是我没有找到一种方法来查找后者是否出现在前者中。 我需要类似re.search(substring,sequence)
东西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
我需要类似
re.search(substring,sequence)
东西re.search(substring,sequence)
但其中sequence
是另一个正则表达式而不是字符串。
如果我理解正确,则需要例如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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.