从 r 中的给定字符串中提取日期

Extract date from given string in r

string<-c("Posted 69 months ago (7/4/2011)")
library(gsubfn)
strapplyc(string, "(.*)", simplify = TRUE)

我应用了上面的函数,但没有任何反应。

在此我只想提取日期部分,即 7/4/2011

我们可以用 gsub 来做到这一点,方法是从字符串的开头 (^) 匹配一个或多个不是 ( ([^(]+) 的字符或 | 字符串末尾 ($) 的 ) 并将其替换为 ""

gsub("[^[^(]+\(|\)$", "", string)
#[1] "7/4/2011"

或者使用捕获组

sub("^[^(]+\(([^)]+).*", "\1", string)
#[1] "7/4/2011"

或者使用 str_extract,我们匹配一个或多个不是 ) ([^)]+) 且跟在 ( ((?<=[(])) 之后的字符

library(stringr)
str_extract(string, "(?<=[(])[^)]+")
#[1] "7/4/2011"

第一个显示如何修复问题中的代码以给出所需的答案。接下来的 2 个解决方案是相同的,只是它们使用不同的正则表达式。第四个解决方案显示了如何使用 gsub 来实现。第五个将 gsub 分成两个 sub 调用,第六个使用 read.table

1) Escape parens 问题是 ( 和 ) 在正则表达式中有特殊含义,所以如果你想按字面匹配它们,你必须转义它们。通过像下面那样使用 "[(]" (或将它们写成 "\(" ),它们按字面意思匹配。内括号定义了捕获组,因为我们不希望该组本身包含文字括号:

strapplyc(string, "[(](.*)[)]", simplify = TRUE)
## [1] "7/4/2011"

2) 匹配内容 另一种方法是匹配数据本身而不是周围的括号。这里 "\d+" 匹配一位或多位数字:

strapplyc(string, "\d+/\d+/\d+", simplify = TRUE)
## [1] "7/4/2011"

如果你想更具体的话,你可以指定位数,但如果数据看起来与问题中的数据相似,这里似乎没有必要。

3) 匹配 8 个或更多的数字和斜线 鉴于在字符串的其余部分中没有其他 8 个或更多字符的序列仅由斜线和数字组成,我们可以只需挑出那个:

strapplyc(string, "[0-9/]{8,}", simplify = TRUE)
## [1] "7/4/2011"

4) 删除之前和之后的文本 另一种方法是删除直到 ( 和之后) 的所有内容,如下所示:

gsub(".*[(]|[)].*", "", string)
## [1] "7/4/2011"

5) sub 这与 (4) 相同,除了它将 gsub 分成两个 sub 调用,一个删除所有内容直到 (和另一个删除 ) 之后。因此,正则表达式稍微简单一些。

sub(".*\(", "", sub("\).*", "", string))

6) read.table 这个解决方案根本不使用正则表达式。它在 read.table 中定义了 sepcomment.char,因此 read.table 结果的第二列是所需的一个或多个日期。

read.table(text = string, sep = "(", comment.char = ")", as.is = TRUE)$V2
## [1] "7/4/2011"

注意:注意在定义string

时不需要c
string <- c("Posted 69 months ago (7/4/2011)")
string2 <- "Posted 69 months ago (7/4/2011)"
identical(string, string2)
## [1] TRUE