我尝试使用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
声明解决这个问题,但我很好奇为什么这不起作用,如果有更好的方法来处理这些案例。
答案 0 :(得分:4)
如果您尝试提取日期,为什么不使用lubridate
包?
> lubridate::mdy("No. 1. June 20th, 1914.")
[1] "1914-01-20 UTC"
(其中mdy
告诉luridate日期数据以月 - 日 - 年顺序出现。)
答案 1 :(得分:2)
由于以下原因,它无法正常工作:
你的正则表达式修复如下:
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"
作为。匹配任何字符,函数返回','之前任何字符的最大可能序列,然后我们使用量词+和?对于条件