从R中的单个字符串中提取两个子字符串

时间:2015-09-03 05:43:31

标签: r string substring

我有一个像这样的文本字段: - :位置: - '12 .839006423950195' - '77 .6580810546875':last_location_update:2015-08-10 16:41:46.817000000 Z

我想提取12.839006423950195和77.6580810546875并将它们放在同一数据框的不同列中。

这些数字的长度各不相同 - 唯一的方法是提取第一个和第二个单引号以及第三和第四个单引号内的内容。

我尝试使用str_locate_all,str_match_all但我无法理解它们。请帮忙。

由于

2 个答案:

答案 0 :(得分:1)

我们可以使用str_extract_all中的library(stringr)。我们使用正则表达式外观来匹配一个或多个带小数([0-9.]+)的数字,这些小数位于单引号((?<=')(?='))内。

library(stringr)
lst <- lapply(str_extract_all(txt, "(?<=')[0-9.]+(?=')") , as.numeric)

如果列表元素的长度相同

df1 <- setNames(do.call(rbind.data.frame, lst), paste0('V', 1:2))

将获得2列'data.frame'

数据

txt <- ":location: - '12.839006423950195' - '77.6580810546875' :last_location_update: 2015-08-10 16:41:46.817000000 Z"

答案 1 :(得分:0)

不使用任何库,可以这样做:

txt <- ":location: - '12.839006423950195' - '77.6580810546875' :last_location_update: 2015-08-10 16:41:46.817000000 Z"
start<-gregexpr("('.*?)[0-9.](.*?')+",txt)[[1]]+1
end<-start+attr(start,"match.length")-3
df<-data.frame(t(apply(cbind(start[1:2],end[1:2]),1,function(x) substr(txt,x[1],x[2]))))

> df
              X1               X2
1 12.839006423950195 77.6580810546875

感谢@thelatemail:

txt <- ":location: - '12.839006423950195' - '77.6580810546875' :last_location_update: 2015-08-10 16:41:46.817000000 Z"
df<-data.frame(t(regmatches(txt, gregexpr("(?<=')[0-9.]+(?=')",txt,perl=TRUE))[[1]]))
df

                  X1               X2
1 12.839006423950195 77.6580810546875