string<-c("Posted 69 months ago (7/4/2011)")
library(gsubfn)
strapplyc(string, "(.*)", simplify = TRUE)
我应用了上述功能,但没有任何反应。
在此我只想提取日期部分,即
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"
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
我们可以使用
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"