R中的正则表达式括号之谜

Regular expression bracket mystery in R

我正在尝试使用 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} 周围的括号,它就会起作用。但是,如果我删除括号,我当然会得到字符串 "No. 1. June 20, 1914."NA。但是,如果我离开括号,这确实有效。

我当然可以通过使用简单的 if/else if 语句来解决这个问题,但我很好奇为什么这不起作用,以及是否有更好的方法来处理这些组合情况。

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

  1. 您的 POSIX 字符 class 没有正确地包含在方括号表达式中。
  2. 您正在尝试使用字符 class 作为可选的组构造。

你的正则表达式固定如下:

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}')
>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"

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

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

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

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