【问题标题】:Regex/ Substring正则表达式/子字符串
【发布时间】:2014-09-10 11:57:23
【问题描述】:

我在列表中有这样的序列"MSGSRRKATPASRTRVGNYEMGRTLGEGSFAKVKYAKNTVTGDQAAIKILDREKVFRHKMVEQLKREISTMKLIKHPNVVEIIEVMASKTKIYIVLELVNGGELFDKIAQQGRLKEDEARRYFQQLINAVDYCHSRGVYHRDLKPENLILDANGVLKVSDFGLSAFSRQVREDGLLHTACGTPNYVAPEVLSDKGYDGAAADVWSCGVILFVLMAGYLPFDEPNLMTLYKRICKAEFSCPPWFSQGAKRVIKRILEPNPITRISIAELLEDEWFKKGYKPPSFDQDDEDITIDDVDAAFSNSKECLVTEKKEKPVSMNAFELISSSSEFSLENLFEKQAQLVKKETRFTSQRSASEIMSKMEETAKPLGFNVRKDNYKIKMKGDKSGRKGQLSVATEVFEVAPSLHVVELRKTGGDTLEFHKVCDSFYKNFSSGLKDVVWNTDAAAEEQKQ"

我想创建一个子字符串,就像出现“K”的地方一样,它需要在“K”之前拉出 6 个字符,在“K”之后拉出 6 个字符

例如:MSGSRRKATPASR,这里是 -6..K..+6

对于整个序列..我尝试了 R 中的子字符串函数,但我们需要指定开始和结束位置。这里位置未知

谢谢

【问题讨论】:

  • 如果两个 K 相隔 6 个字母,就像在 LEDEWFKKGYKPP 中一样,会发生什么?
  • 相关帖子Biostars

标签: regex r substring bioinformatics


【解决方案1】:
.{6}K.{6}

试试这个。这会得到想要的结果。

查看演示。

http://regex101.com/r/dM0rS8/4

【讨论】:

  • 为了在 R 中运行它,当 x 是字符串时执行 regmatches(x, gregexpr(".{6}K.{6}", x, perl = TRUE))
  • @DavidArenburg 对此表示感谢。
【解决方案2】:

使用这个:

\w{7}(?<=K)\w{6}

这使用正向后视来确保在K 之前存在字符。

在这里演示:http://regex101.com/r/pK3jK1/2

【讨论】:

  • 似乎在所有人身上。它总是只捕获K之前的5个字母
  • 是的,我注意到并更新了它..实际上后视并没有选择一个字符,所以这就是为什么我应该选择 7 个字母
  • 为了在 R 中运行它,当 x 是字符串时,您将执行类似 regmatches(x, gregexpr("\\w{7}(?&lt;=K)\\w{6}", x, perl = TRUE)) 的操作。我唯一不明白的是,当 6 个字母范围内有多个 Ks 时会发生什么
  • 谢谢大卫。如果是 LEDEWFKKGYKPP .. 它可以被视为 LEDEWFKKGYKPP 或 EDEWFKKGYKPP(anycharacter) 。我只需要 -6K+6 的不同组合
【解决方案3】:

使用rex 可能会使此类任务更简单一些。

x <- "MSGSRRKATPASRTRVGNYEMGRTLGEGSFAKVKYAKNTVTGDQAAIKILDREKVFRHKMVEQLKREISTMKLIKHPNVVEIIEVMASKTKIYIVLELVNGGELFDKIAQQGRLKEDEARRYFQQLINAVDYCHSRGVYHRDLKPENLILDANGVLKVSDFGLSAFSRQVREDGLLHTACGTPNYVAPEVLSDKGYDGAAADVWSCGVILFVLMAGYLPFDEPNLMTLYKRICKAEFSCPPWFSQGAKRVIKRILEPNPITRISIAELLEDEWFKKGYKPPSFDQDDEDITIDDVDAAFSNSKECLVTEKKEKPVSMNAFELISSSSEFSLENLFEKQAQLVKKETRFTSQRSASEIMSKMEETAKPLGFNVRKDNYKIKMKGDKSGRKGQLSVATEVFEVAPSLHVVELRKTGGDTLEFHKVCDSFYKNFSSGLKDVVWNTDAAAEEQKQ"

library(rex)
re_matches(x,
  rex(
    capture(name = "amino_acids",
      n(any, 6),
      "K",
      n(any, 6)
    )
  ),
  global = TRUE)[[1]]
#>     amino_acids
#>1  MSGSRRKATPASR
#>2  GEGSFAKVKYAKN
#>3  GDQAAIKILDREK
#>4  KMVEQLKREISTM
#>5  IEVMASKTKIYIV
#>6  GGELFDKIAQQGR
#>7  VYHRDLKPENLIL
#>8  DANGVLKVSDFGL
#>9  PEVLSDKGYDGAA
#>10 NLMTLYKRICKAE
#>11 WFSQGAKRVIKRI
#>12 LEDEWFKKGYKPP
#>13 AAFSNSKECLVTE
#>14 LENLFEKQAQLVK
#>15 ASEIMSKMEETAK
#>16 LGFNVRKDNYKIK
#>17 GDKSGRKGQLSVA
#>18 HVVELRKTGGDTL
#>19 VCDSFYKNFSSGL

但是上面是贪心的,每个K只会出现在一个结果中。

如果要为每个 K 输出一个 AA

library(rex)
locs <- re_matches(x,
  rex(
    "K" %if_prev_is% n(any, 6) %if_next_is% n(any, 6)
    ),
  global = TRUE, locations = TRUE)[[1]]

substring(x, locs$start - 6, locs$end + 6)
#> [1] "MSGSRRKATPASR" "GEGSFAKVKYAKN" "GSFAKVKYAKNTV" "AKVKYAKNTVTGD"
#> [5] "GDQAAIKILDREK" "KILDREKVFRHKM" "EKVFRHKMVEQLK" "KMVEQLKREISTM"
#> [9] "REISTMKLIKHPN" "STMKLIKHPNVVE" "IEVMASKTKIYIV" "VMASKTKIYIVLE"
#>[13] "GGELFDKIAQQGR" "AQQGRLKEDEARR" "VYHRDLKPENLIL" "DANGVLKVSDFGL"
#>[17] "PEVLSDKGYDGAA" "NLMTLYKRICKAE" "LYKRICKAEFSCP" "WFSQGAKRVIKRI"
#>[21] "GAKRVIKRILEPN" "LEDEWFKKGYKPP" "EDEWFKKGYKPPS" "WFKKGYKPPSFDQ"
#>[25] "AAFSNSKECLVTE" "ECLVTEKKEKPVS" "CLVTEKKEKPVSM" "VTEKKEKPVSMNA"
#>[29] "LENLFEKQAQLVK" "KQAQLVKKETRFT" "QAQLVKKETRFTS" "ASEIMSKMEETAK"
#>[33] "KMEETAKPLGFNV" "LGFNVRKDNYKIK" "VRKDNYKIKMKGD" "KDNYKIKMKGDKS"
#>[37] "NYKIKMKGDKSGR" "IKMKGDKSGRKGQ" "GDKSGRKGQLSVA" "HVVELRKTGGDTL"
#>[41] "DTLEFHKVCDSFY" "VCDSFYKNFSSGL" "NFSSGLKDVVWNT"

【讨论】:

    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 2019-04-17
    • 2021-09-19
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多