我正在尝试使用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
语句来解决此问题,但是我很好奇为什么它不起作用,以及是否有更好的方法来处理这些合并的情况。
最佳答案
由于以下原因,它不起作用:
您的POSIX字符类未正确包装在带括号的表达式中。
您正在尝试使用字符类作为可选的组构造。
您固定的正则表达式如下所示:
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}')