【问题标题】:Extracting pattern from raw string从原始字符串中提取模式
【发布时间】:2016-06-25 00:25:08
【问题描述】:

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

(,)(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

【问题讨论】:

  • 经纬度后面总是跟日期吗?
  • 嗯,是的。我认同。大数据集,但似乎如此。
  • gsub('.*,((-?\\d+\\.\\d+ ?){2}),.*', '\\1', d$V1)
  • @alistaire 不错。为什么-?
  • @Jota 纬度和经度可以是负数。我不确定他们是否在这里,但如果其他人想尝试调整答案,那就更安全了。

标签: regex r


【解决方案1】:

我会使用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(即(?&lt;=,)


您可以使用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+),但我也匹配从行首到我想要捕获的所有内容:^.+?(?&lt;=,) 和所有内容在它之后直到行尾:.+$


数据:

d <- read.table(text = "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", header = TRUE, comment.char = "", sep = "\t")

【讨论】:

  • 谢谢!使用了您推荐的 gsub 方法,效果很好。
猜你喜欢
  • 2023-01-07
  • 2014-10-09
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多