我想为python脚本生成一个模式,其中指定模式中必须存在任意数量的三个单词?
例如,给定一个序列:
ATG GTC TGA CGA CGG CAG TAA AAA AAA GGG TGG GCA GCC TTT GAA GCC TTT
我想查找所有出现的 19-21mers ,其中至少包含以下任意一个字词:TAG
,TGA
或{ {1}}
我尝试指定模式= TAA
但它似乎不起作用,我确定我做的事情表明我是一个菜鸟。
答案 0 :(得分:1)
我认为正则表达式的表现力足以满足长度要求。
但是,您可以使用窗口迭代器来模拟打开的读框来解决此问题:
# From http://stackoverflow.com/questions/6822725/rolling-or-sliding-window-iterator-in-python:
from itertools import islice
def window(seq, n=2):
"Returns a sliding window (of width n) over data from the iterable"
" s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
it = iter(seq)
result = tuple(islice(it, n))
if len(result) == n:
yield result
for elem in it:
result = result[1:] + (elem,)
yield result
sequence = "ATG GTC TGA CGA CGG CAG TAA AAA AAA GGG TGG GCA GCC TTT GAA GCC TTT"
codons = sequence.split()
orf = window(codons, 7)
matching_codons = ['TGA', 'TAA', 'TAG']
[sequence for sequence in orf if any(codon in matching_codons for codon in sequence)]
解析代码
orf = window(codons, 7)
这定义了一个生成器,它将返回每个长度为7的帧,每次迭代将帧移动1次。
然后,列表推导迭代会做两件事。
它迭代我们ORF中的每个序列:
[sequence for sequence in orf] # returns all possible frames of length 7 in sequence
它过滤结果,只返回包含任何有效密码子的序列:
[sequence for sequence in orf if any(codon in ['TGA', 'TAA', 'TAG'] for codon in sequence)] # Only matches sequences matching 'TGA', 'TAA', or 'TAG'
最后,如果您希望结果本身是子字符串,请使用以下列表comprension:
[' '.join(sequence) for sequence in window(codons, 7) if any(codon in ['TGA', 'TAA', 'TAG'] for codon in sequence)]
<强>结果:强>
['ATG GTC TGA CGA CGG CAG TAA', 'GTC TGA CGA CGG CAG TAA AAA', 'TGA CGA CGG CAG TAA AAA AAA', 'CGA CGG CAG TAA AAA AAA GGG', 'CGG CAG TAA AAA AAA GGG TGG', 'CAG TAA AAA AAA GGG TGG GCA', 'TAA AAA AAA GGG TGG GCA GCC']
答案 1 :(得分:0)
import re
string_to_read="ATG GTC TGA CGA CGG CAG TAA AAA AAA GGG TGG GCA GCC TTT GAA GCC TTT"
res=re.search('(TAT|TGA|TAA)', string_to_read)
if res:
print('matched %s'%res.groups())
此正则表达式将告诉您在您要测试的字符串中是否存在这3个序列中的任何一个。
如果您需要匹配所有3个存在,您可以独立测试所有3个
if re.match('TAT', string_to_read) and re.match('TGA', string_to_read) and re.match('TAA', string_to_read):
print('has all 3')
而不是一些聪明的正则表达式与这3个序列的所有组合。如果你不想运行3个单独的正则表达式,你可以使用像(TAT)|(TGA)|(AAA)
这样的正则表达式做一些事情,然后保持你匹配的所有组的计数,看看你是否已经击中了所有这些组。