regex - 从原始字符串中提取模式

标签 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

最佳答案

我会使用 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),然后重复,但尾部没有空格。整个事情之前应该有一个逗号。因此,您可以对逗号使用后视(即 (?<=,) )


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


数据:

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")

关于regex - 从原始字符串中提取模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38023800/

相关文章:

regex - 如何使用 Perl 忽略多行字符串中的最后一个换行符

javascript - 所有节标题的正则表达式(2.0、2.1.2、2.3.1.5 等)

python - 如何从具有不同内核的笔记本运行 Jupyter 笔记本?

regex - R 中基于正则表达式的列表匹配

regex - 在 grep/ack 中转义括号

java正则表达式量词

c# - 在 C# 正则表达式中是否有等同于\Q ...\E

r - 无法将值插入到 sqlite 表中

r - R中非空数值向量的维数

r - 如何在 R 中验证日期