R:获取非统一的最后一个词/短语

时间:2014-07-25 18:56:36

标签: r string

我在数据框中有一列有一堆单词。最后一个词是我想要提取的,但它是不均匀的。例如:

Other4 00:15:21 RUN 1

Other5 00:50:20 RUN2

其他1 12:15:23运行3

其他2 17:18:19 run4

我如何获取最后一个单词/短语,即“run”这个单词和可能会或可能不会被空格分隔的数字?

我尝试过strsplit

do.call(rbind,
lapply(
strsplit(x," "),
function(y)
cbind(paste(head(y,length(y)-1),collapse=" "),tail(y,1))
)
)

但它只会返回最后一个字/数字

2 个答案:

答案 0 :(得分:3)

v1 <- c("Other4 00:15:21 RUN 1","Other5 00:50:20 RUN2","Other1 12:15:23 Run 3","Other2 17:18:19 run4")

library(stringr)
str_extract(v1, perl('(?<=:\\d{2} )[ A-Za-z0-9]+$'))
[1] "RUN 1" "RUN2"  "Run 3" "run4" 

解释

假设在:之后您只有两位数,(?<=:\\d{2} )的正则表达式:后面跟着两个digitsspace。提取匹配后的数字,字符。

或者

 library(stringi)
 stri_extract_last(v1, regex="[A-Za-z]+ ?\\d+")
 #[1] "RUN 1" "RUN2"  "Run 3" "run4" 

答案 1 :(得分:1)

你走了:

> z <- c("Other4 00:15:21 RUN 1", "Other5 00:50:20 RUN2",
         "Other1 12:15:23 Run 3", "Other2 17:18:19 run4", NULL, "hello")
> pattern <- '.*?(\\w+ *\\d+)$'
> gsub(pattern, '\\1', grep(pattern, z, ignore.case=T, value=T), ignore.case=T)
[1] "RUN 1" "RUN2"  "Run 3" "run4" 

在模式中,我们捕获1个或多个单词字符,后跟0个或更多个空格和1个或多个数字,锚定到结尾。我们使用非贪婪匹配(...)匹配捕获的组.*?之前的文本。

grep内部过滤了向量的内容,gsub外部提取相关部分。