使用带有字边界的 mgsub 函数作为替换值

Using mgsub function with word boundaries for replacement values

我正在尝试用空格替换向量中字符串元素的子字符串。以下是我们正在考虑的载体:

test <- c("PALMA DE MALLORCA", "THE RICH AND THE POOR", "A CAMEL IN THE DESERT", "SANTANDER SL", "LA")

lista <- c("EL", "LA", "ES", "DE", "Y", "DEL", "LOS", "S.L.", "S.A.", "S.C.", "LAS",
       "DEL", "THE", "OF", "AND", "BY", "S", "L", "A", "C", "SA", "SC", "SL")

然后,如果我们按原样应用 mgsub 函数,我们将得到以下输出:

library(qdap)
mgsub(lista, "", test)
# [1] "PM MOR"   "RIH POOR" "M IN ERT" "NTER"     ""  

所以我将列表更改为以下内容并重新执行:

lista <- paste("\b", lista, "\b", sep = "")
mgsub(lista, "", test)
# [1] "PALMA DE MALLORCA"     "THE RICH AND THE POOR" "A CAMEL IN THE DESERT"
# [4] "SANTANDER SL"          "LA"   

我无法让词边界正则表达式适用于此函数。

根据multigsub {qdap} documentation

mgsub(pattern, replacement = NULL, text.var, leadspace = FALSE, trailspace = FALSE, fixed = TRUE, trim = TRUE, ...)
...
fixed
logical. If TRUE, pattern is a string to be matched as is. Overrides all conflicting arguments.

为了确保您的搜索词向量被解析为正则表达式,您需要 "manually" 将 fixed 参数设置为 FALSE

另一个重要说明:. 之后设置的单词边界需要在它(或行尾)之后有一个单词字符。在这种情况下使用 (?!\w) 子模式更安全。要在 R 正则表达式中使用环视,您需要使用类似 Perl 的正则表达式。因此,我建议使用这个(如果非单词字符只能出现在正则表达式的末尾):

lista <- paste("\b", lista, "(?!\w)", sep = "")

或者(如果开头也可以是非单词字符的话):

lista <- paste("(?<!\w)", lista, "(?!\w)", sep = "")

然后

mgsub(lista, "", test, fixed=FALSE, perl=TRUE)