提取两个单词之间的字符串,具有多种模式

Extract a string between two words, with multiple patterns

我有一系列字符串,例如“任命 XX 为负责人”、“任命 YY 为负责人”(包含在标有“title”的列中标有“df”的数据框中)

我想提取包含在两个不同表达式之间的名称 XX、XY。

我目前使用的是:

df$name <- df$title %>% 
  str_extract(regex(pattern = "(?<=Appointment of).*(?= as)", ignore_case=TRUE))

但是,这仅适用于两种可能模式中的一种。

df$name <- df$title %>% 
  str_extract(regex(pattern = "(?<=Appointment of).*(?= as)"|"(?<=joins).*(?= as)", ignore_case=TRUE))

这当然行不通。 我如何创建多个模式以输入 str_extract?

如果需要,很乐意提供更多详细信息!

非常感谢

strapply 可以在不使用零宽度结构的情况下做到这一点。仅返回第二个捕获组。

library(gsubfn)

x <- c("the appointment of XX as head", "appoints YY as head") # input
strapply(x, "(appointment of|appoints) (.*?) as head", ~ ..2, simplify = TRUE)
## [1] "XX" "YY"

或使用 (?:...) 指定第一个括号内的部分不是捕获组:

strapply(x, "(?:appointment of|appoints) (.*?) as head", simplify = TRUE)
## [1] "XX" "YY"

基础 R

在 base R 中,如果 x 的每个组件都匹配,则可以用 sub 完成

sub(".*(appointment of|appoints) (.*?) as head.*", "\2", x)
## [1] "XX" "YY"

如果不是,则进行 strcapture

proto <- data.frame(dummy = character(0), value = character(0))
strcapture("(appointment of|appoints) (.*?) as head", x, proto)[, 2]
## [1] "XX" "YY"

你可以使用

df$name <- df$title %>% 
  str_extract(regex(pattern = "(?<=\bAppointment of\s|\bjoins\s).*?(?=\s+as\b)", ignore_case=TRUE))

详情:

  • (?<= - 正面回顾的开始
    • \bAppointment of\s - 一个单词边界 (\b)、Appointment of,然后是一个空白字符 (\s)
  • | - 或者
    • \bjoins\s - 一个完整的单词 joins 和一个空格
  • ) - 回顾结束
  • .*? - 除换行符以外的任何零个或多个字符
  • (?=\s+as\b) - 需要一个或多个空格的正向前瞻,as 和紧靠当前位置右侧的单词边界。

注意在stringr中lookbehind patterns不是严格固定宽度的,你可以使用

"(?<=\bAppointment of\s{1,100}|\bjoins\s{1,100}).*?(?=\s+as\b)"

其中 \s{1,100} 可以匹配一到一百个空白字符。