使用 stringr 提取字符串中包含特定字符集的整个单词

Use stringr to extract the whole word in a string with a particular set of characters in it

我有一系列具有特定字符集的字符串。我想要做的是能够仅从包含这些字符的字符串中提取单词,并丢弃其余部分。

我已经尝试了各种正则表达式来做到这一点,但我要么让它拆分所有单词,要么 returns 整个字符串。以下是字符串种类的示例。我一直在尝试使用 stringr::str_extract_all(),因为在某些情况下需要删除多个单词。

data <- c("AlvariA?o, 1961","Andrade-Salas, Pineda-Lopez & Garcia-MagaA?a, 1994", "A?vila & Cordeiro, 2015", "BabiA?, 1922")

result <- unlist(stringr::str_extract_all(data, "regex"))

从这里我想要一个结果来提取所有带有“A?”的单词,如下所示:

result <- c("AlvariA?o", "MagaA?a", "A?vila", "BabiA"?)

看起来很简单,但我的正则表达式知识目前还不够用。

要匹配?需要用\?转义,所以A\?会匹配A?\w 匹配任何单词字符(相当于 [a-zA-Z0-9_])并且 * 匹配前一个标记在零到无限次之间,尽可能多次,根据需要回馈(贪婪).

unlist(stringr::str_extract_all(data, "\w*A\?\w*"))
#[1] "AlvariA?o" "MagaA?a"   "A?vila"    "BabiA?"   

我做了一个函数,但比 Gki 的差很多...

    library(quanteda)

    set_of_character <- function(dummy, key){
      n <- nchar(key)
      dummy %>% str_split(., " ") %>%
        unlist %>% 
        str_replace(., ",", "") %>%
        sapply(., function(x) {
          x %>%
            tokens("character") %>%
            unlist() %>%
            char_ngrams(n, concatenator = "")
        }) %>%
        sapply(., function(x) (key %in% x)) %>% which(TRUE) %>% names %>%
        return    
    }

对于你的例子,

    set_of_character(data, "A?")
    [1] "AlvariA?o"      "Garcia-MagaA?a" "A?vila"         "BabiA?"