我试图在 Python 中编码蛋白质序列的理论胰蛋白酶切割。胰蛋白酶的切割规则是:在 R 或 K 之后,而不是在 P 之前。(即胰蛋白酶在每个 K 或 R 之后切割(切割)蛋白质序列,除非(K 或 R)之后是 P)。
示例:序列MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
的切割(cut)应产生以下 4 个序列(肽):
MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK
注意,在第二肽中 K 之后没有切割 (因为 P 在 K 之后),并且在第三肽中 R 之后没有切割 (因为 P 在 R 之后)。
我已经用 Python 编写了此代码,但是效果不佳,有什么方法可以更有意义地实现此正则表达式?
# Open the file and read it line by line.
myprotein = open(raw_input('Enter input filename: '),'r')
if os.path.exists("trypsin_digest.txt"):
os.remove("trypsin_digest.txt")
outfile = open("trypsin_digest.txt",'w+')
for line in myprotein:
protein = line.rstrip()
protein = re.sub('(?<=[RK])(?=[^P])','', protein)
for peptide in protein:
outfile.write(peptide)
print 'results written to:\n', os.getcwd() +'\ trypsin_digest.txt'
这就是我如何得到它为我工作
myprotein = open(raw_input('Enter input filename: '),'r')
my_protein = []
for protein in myprotein:
myprotein = protein.rstrip('\n')
my_protein.append(myprotein)
my_pro = (''.join(my_protein))
#cleaves sequence
peptides = re.sub(r'(?<=[RK])(?=[^P])','\n', my_pro)
print peptides
蛋白质序列:
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK MVPPPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEDGDREICSESK
输出(胰蛋白酶切割位点)或肽
MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK
MVPPPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
正则表达式很好,但这里有一个使用常规 python 的解决方案。由于您正在寻找基地中的子序列,因此将其构建为生成器是有意义的,这会产生片段。
example = 'MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK'
def trypsin(bases):
sub = ''
while bases:
k, r = bases.find('K'), bases.find('R')
cut = min(k, r)+1 if k > 0 and r > 0 else max(k, r)+1
sub += bases[:cut]
bases = bases[cut:]
if not bases or bases[0] != 'P':
yield sub
sub = ''
print list(trypsin(example))
编辑稍微修改你的正则表达式工作得很好:
在你的评论中,你提到你在一个文件中有多个序列(我们称之为sequences.dat):
$ cat sequences.dat
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
>>> with open('sequences.dat') as f:
s = f.read()
>>> print(s)
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
MVPPPPSRGGAAKPGQLGRSLGPLLLLLRPEEPEDGDREICSESK
>>> protein = re.sub(r'(?<=[RK])(?=[^P])','\n', s, re.DOTALL)
>>> protein.split()
['MVPPPPSR', 'GGAAKPGQLGR', 'SLGPLLLLLRPEEPEDGDR', 'EICSESK', 'MVPPPPSR', 'GGAAKPGQLGR', 'SLGPLLLLLRPEEPEDGDR', 'EICSESK', 'MVPPPPSR', 'GGAAKPGQLGR', 'SLGPLLLLLRPEEPEDGDR', 'EICSESK']
>>> print protein
MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK
MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK
MVPPPPSR
GGAAKPGQLGR
SLGPLLLLLRPEEPEDGDR
EICSESK
我相信的 regexp 会做你所描述的:
([KR]?[^P].*?[KR](?!P))
以下结果来自pythonregexp
>>> regex = re.compile("([KR]?[^P].*?[KR](?!P))")
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0xb1a9f49eb4111980>
>>> regex.match(string)
<_sre.SRE_Match object at 0xb1a9f49eb4102980>
# List the groups found
>>> r.groups()
(u'MVPPPPSR',)
# List the named dictionary objects found
>>> r.groupdict()
{}
# Run findall
>>> regex.findall(string)
[u'MVPPPPSR', u'GGAAKPGQLGR', u'SLGPLLLLLRPEEPEDGDR', u'EICSESK']
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(3条)