【问题标题】:Extract date from given string in r从r中的给定字符串中提取日期
【发布时间】:2017-04-14 05:21:59
【问题描述】:
string<-c("Posted 69 months ago (7/4/2011)")
library(gsubfn)
strapplyc(string, "(.*)", simplify = TRUE)

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

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

【问题讨论】:

    标签: r date-formatting


    【解决方案1】:

    第一个展示了如何修复问题中的代码以给出所需的答案。接下来的 2 个解决方案是相同的,只是它们使用不同的正则表达式。第四个解决方案展示了如何使用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 这个解决方案根本不使用正则表达式。它在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
    

    【讨论】:

    • 多种选择,感谢您的详尽解答
    【解决方案2】:

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

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

    或者使用捕获组

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2016-06-24
      相关资源
      最近更新 更多