r-regex:在最靠近另一个模式左侧的模式之间获取文本



我有一个字符串txt,其中包括模式John和几个国家。我还有vec_regex,这是一组匹配国家/地区的正则表达式(但不是在文本中全部提到(。

我想得到的是约翰和约翰左边最匹配的国家之间的文本:法国文本约翰。

我认为这是一个需要的负面展望,但我无法让它发挥作用。(请参阅此处和此处(。非常感谢!

library(stringr)
txt <- "Germany Russia and Germany Russia text Germany text France text John text text France and Spain"
vec_regex <- c("German\w*", "France|French", "Spain|Spanish", "Russia\w*")
vec_regex_or <- paste(vec_regex, collapse="|")
vec_regex_or
#> [1] "German\w*|France|French|Spain|Spanish|Russia\w*"
pattern_left <- paste0("(",vec_regex_or, ")",".*John")
pattern_left
#> [1] "(German\w*|France|French|Spain|Spanish|Russia\w*).*John"
str_extract(txt, regex(pattern_left))
#> [1] "Germany Russia and Germany Russia text Germany text France text John"
pattern_left <- paste0("(",vec_regex_or, ")","(?!(",vec_regex_or,"))",".*John") #neg. lookahead
pattern_left
#> [1] "(German\w*|France|French|Spain|Spanish|Russia\w*)(?!(German\w*|France|French|Spain|Spanish|Russia\w*)).*John"
str_extract(txt, regex(pattern_left))
#> [1] "Germany Russia and Germany Russia text Germany text France text John"

创建于2021-12-30由reprex包(v2.0.1(

您需要使用

pattern_left <- paste0("(",vec_regex_or, ")","(?:(?!",vec_regex_or,").)*","John")
pattern_left
# => [1] "(German\w*|France|French|Spain|Spanish|Russia\w*)(?:(?!German\w*|France|French|Spain|Spanish|Russia\w*).)*John"
str_extract(txt, regex(pattern_left))
# => [1] "France text John"

"(?:(?!",vec_regex_or,").)*"部分正确创建回火贪婪令牌。

此外,如果您计划将这些字符串作为完整的单词进行匹配,请考虑添加单词边界:

pattern_left <- paste0("\b(",vec_regex_or, ")\b","(?:(?!",vec_regex_or,").)*","John\b")

最新更新