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

问题描述 投票:0回答:2
string<-c("Posted 69 months ago (7/4/2011)")
library(gsubfn)
strapplyc(string, "(.*)", simplify = TRUE)

我应用了上述功能,但没有任何反应。

在此我只想提取日期部分,即

7/4/2011

r date-formatting
2个回答
22
投票

第一个展示了如何修复问题中的代码以给出所需的答案。接下来的两个解决方案是相同的,只是它们使用不同的正则表达式。第四个解决方案展示了如何使用

gsub
来做到这一点。第五个将
gsub
分成两个
sub
调用,第六个使用
read.table

1) 转义括号 问题在于 ( 和 ) 在正则表达式中具有特殊含义,因此如果您想按字面匹配它们,则必须对它们进行转义。通过像我们下面那样使用

"[(]"
(或将它们写为
"\\("
),它们会按字面意思匹配。内部括号定义捕获组,因为我们不希望该组包含文字括号本身:

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 该解决方案根本不使用正则表达式。它在

sep
中定义了
comment.char
read.table
,以便
read.table
结果的第二列是所需的一个或多个日期。

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

7) trimws 这会修剪 ( 或 ) 两端的所有内容,然后修剪 ( 和 )。

string |>
  trimws(whitespace = "[^()]") |>
  trimws(whitespace = "[()]")
## [1] "7/4/2011"

注意: 请注意,定义

c
 时不需要 
string

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

6
投票

我们可以使用

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"
© www.soinside.com 2019 - 2024. All rights reserved.