我有这些字符串:
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
>
做正确的方法是什么?
答案 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