我已经在正则表达式中阅读了关于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
以下函数调用返回匹配项:
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中使用。
答案 0 :(得分:3)
使用\k
( \K
保持文本匹配到目前为止的整个正则表达式匹配。)和积极的前瞻。
> regmatches(x,regexpr('\\[\\K[\\w:/]+\\s[+\\-]\\d{4}(?=\\])',x,perl=TRUE))
[1] "07/Dec/2014:06:43:43 -0800"
\\K
中的 \\[\\K
会丢弃先前匹配的[
字符。
答案 1 :(得分:2)
答案 2 :(得分:2)
尝试使用qdapRegex
包,它有一个从方括号中提取元素的特殊方法
library(qdapRegex)
rm_square(x, extract = TRUE)[[1]]
## [1] "07/Dec/2014:06:43:43 -0800"
答案 3 :(得分:1)
使用sub
非常容易。您可以使用匹配组替换整个字符串。
sub(".*\\[([A-z0-9:/]+\\s[+-]\\d{4})\\].*", "\\1", x)
# [1] "07/Dec/2014:06:43:43 -0800"