我在数据框中有一列有一堆单词。最后一个词是我想要提取的,但它是不均匀的。例如:
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))
)
)
但它只会返回最后一个字/数字
答案 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} )
的正则表达式:
后面跟着两个digits
和space
。提取匹配后的数字,字符。
或者
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
外部提取相关部分。