从原始字符串中提取模式

时间:2016-06-25 00:25:08

标签: regex r

我正在尝试从原始数据集中提取纬度和经度。我感兴趣的信息总是遵循相同的模式,即:

(,)(0-9)([.])(0-9) space (0-9)([.])(0-9)(,)

当我执行以下操作时,我能够准确删除我想要保留的信息。有没有办法做反过来,实际上使用gsub保存我正在删除的信息?

data$l1<-gsub('(,)([0-9]+)([.])([0-9]+)[ ]([0-9]+)([.])([0-9]+)(,)', 
              '\\2\\3\\4\\5\\6\\7',
              data$V1)

数据集看起来像这样:

V1
60346241,[37.55 55.22 5km],katekin,55.745011917 37.604520766,2013-12-04 11:59:07
603423423,[37.55 55.22 5km],#hello,#yes,miguel,53.23452 38.7379422,2013-12-04 11:49:09

所以,在这个例子中,我想生成一个新的变量V2,即

V2
55.745011917 37.604520766
53.23452 38.7379422

1 个答案:

答案 0 :(得分:3)

我会使用gregexprregmatches

regmatches(d$V1, gregexpr("(?<=,)\\d{1,3}\\.\\d+\\s\\d{1,3}\\.\\d+", d$V1, perl = TRUE))

#[[1]]
#[1] "55.745011917 37.604520766"
#
#[[2]]
#[1] "53.23452 38.7379422"

取消列出它并将其放入一个新变量由提问者决定。

这里的方法是查找1到3位数后跟一个小数(\\d{1,3}\\.)后跟一些数字和一个空格(\\d+\\s),然后重复,除了没有尾随空格。整个事情应该以逗号开头。因此,您可以使用lookbehind作为逗号(即(?<=,)

您可以使用gsub,但稍作修改:

gsub("^.+?(?<=,)(\\d{1,3}\\.\\d+\\s\\d{1,3}\\.\\d+).+$", "\\1", d$V1, perl = TRUE)
# [1] "55.745011917 37.604520766" "53.23452 38.7379422"

使用gsub方法,我使用捕获组捕获我想要的部分:(\\d{1,3}\\.\\d+\\s\\d{1,3}\\.\\d+),但我也匹配从行的开头到我想要捕获的所有内容:{ {1}}及其后的所有内容,直到该行结束:^.+?(?<=,)

数据:

.+$