【问题标题】:R regular expressions, trying to capture a groupR正则表达式,试图捕获一个组
【发布时间】:2015-01-15 15:33:13
【问题描述】:

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

【问题讨论】:

    标签: regex r


    【解决方案1】:

    使用\k(\K 将匹配的文本保持在整体正则表达式匹配之外。)和积极的前瞻。

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

    \\[\\K 中的\\K 丢弃之前匹配的[ 字符。

    【讨论】:

      【解决方案2】:
      (?<=\[)([\w:\/]+\s[+\-]\d{4})(?=\])
      

      试试这个。查看演示。

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

      【讨论】:

      • 正则表达式不是问题,我不认为。从 R 获取匹配是。
      • @Arima 这应该可以满足您的需求
      • 您只需要在有存储字母的地方添加额外的反斜杠,例如s、w 等。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        sub 非常简单。您可以将整个字符串替换为匹配的组。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-31
          • 2018-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多