R 正则表达式,试图捕获一组

R regular expressions, trying to capture a group

我已经阅读了一些关于正则表达式中的 R 捕获组的其他问题,但我运气不佳。

我有一个字符串:

127.0.0.1 - - [07/Dec/2014:06:43:43 -0800] \"OPTIONS * HTTP/1.0\" 200 - \"-\" \"Apache/2.2.14 (Ubuntu) PHP/5.3.2-1ubuntu4.24 with Suhosin-Patch mod_ssl/2.2.14 OpenSSL/0.9.8k mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 (internal dummy connection)\"

我试图从中获取时间戳:

07/Dec/2014:06:43:43 -0800

以下函数调用returns匹配:

regmatches(x,regexpr('\[([\w:/]+\s[+\-]\d{4})\]',x,perl=TRUE))
[1] "[07/Dec/2014:06:43:43 -0800]"

我试图用 str_match 和这个正则表达式的不同变体来捕捉单个组本身:

str_match(x, "\[([\w:/]+\s[+\-]\d{4})\]")
     [,1] [,2]
[1,] NA   NA

无济于事。这个正则表达式的不同种类在大多数在线正则表达式测试器中都能正确测试,所以我认为正则表达式不是问题所在。

我怎样才能只得到时间戳本身,这样我就可以把它抽到 strptime 中,而不用做 gsub 括号之类的事情? gsub 无法为我获取组,str_match 无效,我错过了什么?理想的输出是

07/Dec/2014:06:43:43 -0800

然后我可以在 strptime 中使用它。

(?<=\[)([\w:\/]+\s[+\-]\d{4})(?=\])

尝试 this.See 演示。

https://regex101.com/r/tX2bH4/16

使用 \k\K 将文本匹配到整个正则表达式匹配之外。)和积极的前瞻。

> regmatches(x,regexpr('\[\K[\w:/]+\s[+\-]\d{4}(?=\])',x,perl=TRUE))
[1] "07/Dec/2014:06:43:43 -0800"

\K in \[\K 丢弃先前匹配的 [ 字符。

试试 qdapRegex 包,它有一个从方括号中提取元素的特殊方法

library(qdapRegex)
rm_square(x, extract = TRUE)[[1]]
## [1] "07/Dec/2014:06:43:43 -0800"

使用 sub 非常容易。您可以用匹配的组替换整个字符串。

sub(".*\[([A-z0-9:/]+\s[+-]\d{4})\].*", "\1", x)
# [1] "07/Dec/2014:06:43:43 -0800"