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
语句来解决这个问题,但我很好奇为什么这不起作用,以及是否有更好的方法来处理这些组合情况。
由于以下原因无法正常工作:
- 您的 POSIX 字符 class 没有正确地包含在方括号表达式中。
- 您正在尝试使用字符 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 日期数据以月-日-年的顺序出现)。
我正在尝试使用 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
语句来解决这个问题,但我很好奇为什么这不起作用,以及是否有更好的方法来处理这些组合情况。
由于以下原因无法正常工作:
- 您的 POSIX 字符 class 没有正确地包含在方括号表达式中。
- 您正在尝试使用字符 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 日期数据以月-日-年的顺序出现)。