使用R中的正则表达式捕获字符串的一部分

时间:2015-05-27 00:57:47

标签: regex r

我有这些字符串:

myseq <- c("ALM_GSK_LN_06.ID","AS04_LV_06.ID.png","AS04_SP_06.IP.png")

我想要做的是捕捉序列的一部分

ALM_GSK  LN  ID
AS04     LV  ID
AS04     SP  IP

我尝试了但失败了:

library(stringr)
str_match(myseq, "([A-Z]+)_(LN|LV|SP)_06\\.([A-Z]+)")

产生:

     [,1]           [,2]  [,3] [,4]
[1,] "GSK_LN_06.ID" "GSK" "LN" "ID"
[2,] NA             NA    NA   NA  
[3,] NA             NA    NA   NA  
> 

做正确的方法是什么?

3 个答案:

答案 0 :(得分:3)

你非常接近。这是一个小调整:

str_match(myseq, "(.+)_(LN|LV|SP)_06\\.([A-Z]+)")[, -1]

产生

     [,1]      [,2] [,3]
[1,] "ALM_GSK" "LN" "ID"
[2,] "AS04"    "LV" "ID"
[3,] "AS04"    "SP" "IP"

您的第一个令牌既不匹配数字也不匹配,您需要“AS04”(数字)和“ALM_GSK”(下划线)。

答案 1 :(得分:3)

您的正则表达式错误地匹配前缀,因为[A-Z]+仅匹配字母。要解决此问题,只需将第一个组更改为贪婪的运算符,例如(.+),这是另一个解决方案。

library(gsubfn)
myseq <- c('ALM_GSK_LN_06.ID', 'AS04_LV_06.ID.png', 'AS04_SP_06.IP.png')
strapply(myseq, '(.+)_([A-Z]+)[^.]+\\.([A-Z]+)', c, simplify = rbind)

#      [,1]      [,2] [,3]
# [1,] "ALM_GSK" "LN" "ID"
# [2,] "AS04"    "LV" "ID"
# [3,] "AS04"    "SP" "IP"

答案 2 :(得分:2)

完全窃取@ hwnd的正则表达式,但采用 tidyr / dplyr 方法:

library(dplyr); library(tidyr)
data_frame(myseq) %>%
    extract(myseq, c('A', 'B', 'C'), '(.+)_([A-Z]+)[^.]+\\.([A-Z]+)')

##         A  B  C
## 1 ALM_GSK LN ID
## 2    AS04 LV ID
## 3    AS04 SP IP