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

时间:2015-10-29 10:19:50

标签: regex r qdap character-replacement

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

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"   

我无法让单词boundary regex适用于此函数。

1 个答案:

答案 0 :(得分:2)

根据multigsub {qdap} documentation

  

mgsub(pattern, replacement = NULL, text.var, leadspace = FALSE, trailspace = FALSE, fixed = TRUE, trim = TRUE, ...)
  ...
  的 fixed
  逻辑。如果是TRUE,则pattern是要按原样匹配的字符串。覆盖所有冲突的参数。

为确保您的搜索字词向量被解析为正则表达式,您需要&#34;手动&#34;将fixed参数设置为FALSE

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

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

或(如果开头也可能有非单词字符):

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

然后

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