提取两个单词之间的字符串,具有多种模式
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}
可以匹配一到一百个空白字符。
我有一系列字符串,例如“任命 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}
可以匹配一到一百个空白字符。