代码之家  ›  专栏  ›  技术社区  ›  sane

Regex/基底

  •  0
  • sane  · 技术社区  · 10 年前

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

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

    前任: MSGSRRKATPASR ,此处-6.K..+6

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

    谢谢

    3 回复  |  直到 10 年前
        1
  •  4
  •   vks    10 年前
    .{6}K.{6}
    

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

    请参见演示。

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

        2
  •  4
  •   aelor    10 年前

    使用此选项:

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

    这使用正向查找来确保之前存在字符 K .

    此处演示: http://regex101.com/r/pK3jK1/2

        3
  •  3
  •   Jim    10 年前

    使用 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"