【问题标题】:How to extract substrings in R using stringr::str_match如何使用 stringr::str_match 在 R 中提取子字符串
【发布时间】:2018-07-04 05:15:12
【问题描述】:

我有以下两个字符串:

x <- "chr1:625000-635000.BB_162.Adipose"
y <- "chr1:625000-635000.BB_162.combined.HMSC-ad"

使用这个正则表达式,我可以毫无问题地捕获 x 的部分内容

> stringr::str_match(x,"(\\w+):(\\d+)-(\\d+)\\.(\\w+)\\.(\\w+)")
     [,1]                                [,2]   [,3]     [,4]     [,5]     [,6]     
[1,] "chr1:625000-635000.BB_162.Adipose" "chr1" "625000" "635000" "BB_162" "Adipose"

我想做的是用y来获得这个

     [,1]                                [,2]   [,3]     [,4]     [,5]     [,6]     
[1,] "chr1:625000-635000.BB_162.combined.HMSC-ad"  "chr1" "625000" "635000" "BB_162" "HMSC-ad"

使用我当前的正则表达式并申请y 我得到了这个:

   [,1]                                 [,2]   [,3]     [,4]     [,5]     [,6]      
[1,] "chr1:625000-635000.BB_162.combined" "chr1" "625000" "635000" "BB_162" "combined"

如何概括我的正则表达式,以便它可以同时处理xy

更新

S.Kalbar,你的正则表达式给出了这个:

> stringr::str_match(y,"(\\w+):(\\d+)-(\\d+)\\.(\\w+)\\.(\\w+)(?:\\.([A-Za-z-]+))?")
     [,1]                                         [,2]   [,3]     [,4]     [,5]     [,6]       [,7]     
[1,] "chr1:625000-635000.BB_162.combined.HMSC-ad" "chr1" "625000" "635000" "BB_162" "combined" "HMSC-ad"
> stringr::str_match(x,"(\\w+):(\\d+)-(\\d+)\\.(\\w+)\\.(\\w+)(?:\\.([A-Za-z-]+))?")
     [,1]                                [,2]   [,3]     [,4]     [,5]     [,6]      [,7]
[1,] "chr1:625000-635000.BB_162.Adipose" "chr1" "625000" "635000" "BB_162" "Adipose" NA 

我想得到的是y

                                          [,1]     [,2]   [,3]     [,4]     [,5]     [,6]        
[1,] "chr1:625000-635000.BB_162.combined.HMSC-ad" "chr1" "625000" "635000" "BB_162" "HMSC-ad"

这是x

                                   [,1]  [,2]   [,3]     [,4]     [,5]     [,6]      
[1,] "chr1:625000-635000.BB_162.Adipose" "chr1" "625000" "635000" "BB_162" "Adipose" 

【问题讨论】:

  • 对于一般的正则表达式问题,在regex 101 上使用您的示例会有所帮助。

标签: r regex tidyverse stringr


【解决方案1】:

正则表达式(\w+):(\d+)-(\d+)\.(\w+)(?:\.\w+)?(?:\.([A-Za-z-]+))

RegEx demo

【讨论】:

  • @S.Kalbar 似乎x 的答案不正确,它得到Adipos 而没有结束e。另外请用R代码举例。
  • @S.Kalbar 在我的 OP 中指出。我寻找可以同时处理xyone 正则表达式。
【解决方案2】:

你可以给引擎一些令牌来拆分:

(?:(?<=\\d)-(?=\\d))|(?:\\.combined\\.)|[.:]+

分解,这说:

(?:(?<=\\d)-(?=\\d))  # a dash between numbers
|                     # or
(?:\\.combined\\.)    # .combined. literally
|                     # or
[.:]+                 # one of . or :


R 中使用str_split()
library(stringr)

x <- c("chr1:625000-635000.BB_162.Adipose", "chr1:625000-635000.BB_162.combined.HMSC-ad")
str_split(x, '(?:(?<=\\d)-(?=\\d))|(?:\\.combined\\.)|[.:]+', simplify = TRUE)

产量

     [,1]   [,2]     [,3]     [,4]     [,5]     
[1,] "chr1" "625000" "635000" "BB_162" "Adipose"
[2,] "chr1" "625000" "635000" "BB_162" "HMSC-ad"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2016-06-15
    • 2019-02-03
    相关资源
    最近更新 更多