R

时间:2015-08-11 04:39:19

标签: regex r stringr

我尝试使用str_extract在文本文档中查找日期。但是,我遇到了一个难题。一般来说,我希望日期有两种形式:1)June 15th, 1914 2)June 15, 1914。但是当我尝试构建一个模式来捕获这两个选项时,我得到一个NA结果。

例如,如果我尝试str_extract("No. 1. June 20th, 1914.", "[:alpha:]{3,8} [0-9]{1,2}[[a-z]{2}]?, [0-9]{4}"),我会NA。但如果我删除[a-z]{2}周围的括号,它就可以了。但是,如果删除括号,我当然会为字符串NA获得"No. 1. June 20, 1914."。但是,如果我留下括号,这确实有效。

我当然可以通过使用简单的if/else if声明解决这个问题,但我很好奇为什么这不起作用,如果有更好的方法来处理这些案例。

3 个答案:

答案 0 :(得分:4)

如果您尝试提取日期,为什么不使用lubridate包?

> lubridate::mdy("No. 1. June 20th, 1914.")
[1] "1914-01-20 UTC"

(其中mdy告诉luridate日期数据以月 - 日 - 年顺序出现。)

答案 1 :(得分:2)

由于以下原因,它无法正常工作:

  1. 您的POSIX字符类未正确包装在括号内的表达式中。
  2. 您正在尝试将字符类用作可选的组构造。
  3. 你的正则表达式修复如下:

    x <- 'No. 1. June 20th, 1914.'
    str_extract(x, '[[:alpha:]]{3,8} [0-9]{1,2}([a-z]{2})?, [0-9]{4}')
    ## [1] "June 20th, 1914"
    

    您可以修改正则表达式:

    str_extract(x, '[a-zA-Z]+ \\d{1,2}([a-z]{2})?, \\d{4}')
    

答案 2 :(得分:2)

>str_extract("No. 1. June 20, 1914.", "[[:alpha:]]{3,8} [[:digit:]]{1,2}.+?, [[:digit:]]{4}")
[1] "June 20, 1914"

> str_extract("No. 1. June 20th, 1914.", "[[:alpha:]]{3,8} [[:digit:]]{1,2}.+?, [[:digit:]]{4}")
[1] "June 20th, 1914"

作为。匹配任何字符,函数返回','之前任何字符的最大可能序列,然后我们使用量词+和?对于条件