2015-01-15 53 views
2

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

回答

3

使用\k\K保持至今匹配了整体正则表达式匹配。的文本)和一个积极的前瞻。

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

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

+0

谢谢!定时器启动时将接受。 – Arima 2015-01-15 15:39:59

+0

不客气.. – 2015-01-15 15:49:09

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

试试看。

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

+0

正则表达式不是问题,我不认为。从R得到匹配是。 – Arima 2015-01-15 15:37:44

+0

@Arima这应该得到你想要的东西 – vks 2015-01-15 15:40:39

+0

你只需要添加额外的反斜杠,以存储诸如's','w'等字母。 – 2015-01-15 17:18:48

2

尝试qdapRegex包有从方括号

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

这是很容易与sub提取元素的特殊方法。您可以用匹配的组替换整个字符串。

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