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

时间:2015-01-15 15:33:13

标签: regex r

我已经在正则表达式中阅读了关于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中使用。

4 个答案:

答案 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)

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

试试这个。看看演示。

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

答案 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"