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

3

我看了一些关于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个回答

3

使用\k\K保持已匹配的文本,不包括整个正则表达式的匹配结果。)和正向先行断言。

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

\\K\\[\\K中,会忽略之前匹配的[字符。


2

正则表达式不是问题,我觉得关键在于从 R 中获取匹配结果。 - Arima
@Arima 这应该能满足你的需求。 - vks
您只需在存储字母(如sw等)的每个位置添加额外的反斜杠即可。 - David Arenburg

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接