从 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
中定义了 sep
和 comment.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
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
中定义了 sep
和 comment.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