正则表达式后视中的可选模式部分

Optional pattern part in regex lookbehind

在下面的示例中,我试图提取 'Supreme Court' 或 'Supreme Court of the United States' 和下一个日期(包括日期)之间的文本。下面的结果不是我想要的,因为结果 2 包括“美国”。

我假设错误是由于 .*? 部分引起的,因为 . 也可以匹配 'of the United States'。任何想法如何排除它? 我想更一般地说,问题是如何将可选的 'element' 包含到后视中(这似乎是不可能的,因为 ? 使其成为非固定长度输入)。 非常感谢!

library(tidyverse)
txt <- c("The US Supreme Court decided on 2 April 2020 The Supreme Court of the United States decided on 5 March 2011 also.")

str_extract_all(txt, regex("(?<=Supreme Court)(\sof the United States)?.*?\d{1,2}\s\w+\s\d{2,4}"))
#> [[1]]
#> [1] " decided on 2 April 2020"                     
#> [2] " of the United States decided on 5 March 2011"

reprex package (v2.0.1)

于 2021-12-09 创建

我也试过了

   str_extract_all(txt, regex("(?<=(Supreme Court)|(Supreme Court of the United States)).*?\d{1,2}\s\w+\s\d{2,4}"))

但是结果是一样的

您可以使用 str_match_all 和群组捕获来做到这一点:

str_match_all(txt, regex("Supreme Court(?:\sof the United States)?(.*?\d{1,2}\s\w+\s\d{2,4})")) %>% 
  .[[1]] %>% .[, 2]

[1] " decided on 2 April 2020" " decided on 5 March 2011"

在这种情况下,我更愿意使用在 Base R 中实现的 perl 引擎,而不是 stringr/stringi 使用的 ICU 库引擎。

pattern <- "Supreme Court (of the United States ?)?\K.*?\d{1,2}\s\w+\s\d{2,4}"
regmatches(txt, gregexpr(pattern, txt, perl = TRUE))

[[1]]
[1] "decided on 2 April 2020" "decided on 5 March 2011"