string<-c("Posted 69 months ago (7/4/2011)")
library(gsubfn)
strapplyc(string, "(.*)", simplify = TRUE)
我应用了上述功能,但没有任何 react 。
在这里我只想提取日期部分,即
7/4/2011
。
最佳答案
第一个显示如何解决问题中的代码以提供所需的答案。接下来的两个解决方案是相同的,除了它们使用不同的正则表达式。第四个解决方案展示了如何使用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"
注意:注意,在定义
c
时不需要string
string <- c("Posted 69 months ago (7/4/2011)")
string2 <- "Posted 69 months ago (7/4/2011)"
identical(string, string2)
## [1] TRUE
关于r - 从r中给定的字符串中提取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43405615/