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

问题描述:

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

我应用上面的函数,但没有任何反应。从r中给出的字符串中提取日期

在这个我想提取仅日期部分,即7/4/2011

第一个展示如何解决的问题的代码,以得到所需要的答案。接下来的两个解决方案是相同的,只是它们使用不同的正则表达式第四个解决方案显示如何使用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" 

注:请注意,您不需要c定义string

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

不知道为什么它得到downvoted。不错的选择。 – akrun

我们可以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" 

这将在“NN/NN/NNNN形式相匹配的日期“或”n/n/nnnn“并替换前后的所有内容。该圆括号表示捕捉级,并有无关,与你的字符串括号不匹配的模式,并丢弃:

gsub(".*(\\d{1,2}/\\d{1,2}/\\d{4}).*", "\\1", string) 
"[1] "7/4/2011" 

的量词条款“{1,2}”匹配任何在它之前一次或两次的模式。在这种情况下,它是匹配的数字。没有证实这是一个日期。对于您需要:

as.Date(gsub(".*(\\d{1,2}/\\d{1,2}/\\d{4}).*", "\\1", string) , format="%m/%d/%Y") 
#[1] "2011-07-04" 

阅读细节:

?regex