【问题标题】:Does a regular expression exist for enzymatic cleavage?酶促切割是否存在正则表达式?
【发布时间】:2010-12-23 08:57:50
【问题描述】:

对于protein 序列的(理论上)tryptic 切割是否存在正则表达式?胰蛋白酶的切割规则是:在R或K之后,而不是在P之前。

例子:

序列VGTKCCTKPESERMPCTEDYLSLILNR的切割应该产生这3个序列(peptides):

 VGTK
 CCTKPESER
 MPCTEDYLSLILNR

请注意,在第二个肽段中 K 之后没有切割(因为 P 在 K 之后)。

在 Perl 中(也可以在 C#、Python 或 Ruby 中):

  my $seq = 'VGTRCCTKPESERMPCTEDYLSLILNR';
  my @peptides = split /someRegularExpression/, $seq;

我使用了这种解决方法(其中首先在序列中插入剪切标记 =,如果 P 紧接在剪切标记之后,则再次删除):

  my $seq      = 'VGTRCCTKPESERMPCTEDYLSLILNR';
  $seq         =~ s/([RK])/$1=/g; #Main cut rule.
  $seq         =~ s/=P/P/g;       #The exception.
  my @peptides = split( /=/, $seq);

但这需要修改一个可能很长并且可能有数百万个序列的字符串。有没有一种方法可以将正则表达式与拆分一起使用?如果是,正则表达式是什么?


测试平台:Windows XP 64 位。 ActivePerl 64 位。来自 perl -v:为 MSWin32-x64-multi-thread 构建的 v5.10.0。

【问题讨论】:

  • @unknown:上下文...来自en.wikipedia.org/wiki/Tryptic:“胰蛋白酶被认为是内肽酶,即切割发生在多肽链内,而不是位于多肽末端的末端氨基酸。”
  • 可能是有史以来最好的 SO 问题。有多少其他人可以同时夸耀代码、科学和性推理,同时又完全有效且可回答?

标签: regex perl bioinformatics


【解决方案1】:

您可以使用look-around assertions 排除这种情况。像这样的东西应该可以工作:

split(/(?<=[RK](?!P))/, $seq)

【讨论】:

  • 抱歉,如果我错了,但这不会在序列中的 R/K 之前而不是之后分裂吗?
  • 确实,这行不通。 RK 需要积极地向后看 (?
  • @Anon and gab:是的,它导致之前被剪切; 4 种多肽:VGT、RCCTKPESE、RMPCTEDYLSLILN 和 R
【解决方案2】:

您可以使用lookaheads 和lookbehinds 来匹配这些东西,同时仍然获得正确的位置。

/(?<=[RK])(?!P)/

应该在 R 或 K 之后没有 P 的点上分裂。

【讨论】:

  • /(?&lt;[RK])(?=[^P])/ 避免在末尾拆分空字符串
  • 两者:编译时不接受。对于 ysth:“序列 (?
  • 对不起,我搞砸了正向的lookbehind语法。应该是(?&lt;=...。我会改正的。
  • 我复制了他的错误:( - 它应该是/(?&lt;=[RK])(?=[^P])/ - 但由于默认情况下拆分会删除尾随的空字段,因此只有拆分固定数量的字段或使用正则表达式才有意义除了拆分之外。
【解决方案3】:

在 Python 中,您可以使用 finditer 方法返回不重叠的模式匹配,包括开始和跨度信息。然后,您可以存储字符串偏移量而不是重建字符串。

【讨论】:

【解决方案4】:

您确实需要结合使用积极的后瞻和消极的前瞻。正确的(Perl)语法如下:

my @peptides = split(/(?!P)(?<=[RK])/, $seq);

【讨论】:

  • 你的意思是负前瞻和正后瞻。
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2010-09-12
相关资源
最近更新 更多