【问题标题】:Using mgsub function with word boundaries for replacement values使用带有单词边界的 mgsub 函数来替换值
【发布时间】:2016-01-29 10:26:20
【问题描述】:

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

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"   

我无法让单词边界正则表达式为此函数工作。

【问题讨论】:

  • 首先,尝试lista &lt;- paste("(?&lt;!\\w)", lista, "(?!\\w)", sep = ""),然后尝试mgsub(lista, "", test, perl=TRUE)。单词边界不适用于lista 中的所有项目,那些以. 结尾的项目。
  • @stribizhev 尝试过,但仍然没有从模式列表中提取 test 中的元素
  • @stribizhev 我删除了所有标点符号,但仍然无法正常工作。有什么想法吗?
  • 默认的fixed = TRUE 可能是导致问题的原因。使用fixed = FALSE。如:mgsub(lista, "", test, fixed=FALSE); ##[1] "PALMA MALLORCA" "RICH POOR" "CAMEL IN DESERT" "SANTANDER" ""
  • @TylerRinker 这正是问题所在,我之前并不完全理解这个论点,我将其设置为 TRUE。谢谢

标签: regex r qdap character-replacement


【解决方案1】:

根据multigsub {qdap} documentation

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

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

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

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

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

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

然后

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

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多