5

我需要用字符串 B 替换字符串 A,仅当字符串 A 是一个完整的单词(例如“MECH”)时,我不想在 A 是较长字符串的一部分时进行替换(例如“MECHANICAL”) . 到目前为止,我有一个 grepl() 来检查字符串 A 是否是一个完整的字符串,但我不知道如何进行替换。我添加了一个 ifelse(),其想法是在 grep() 返回 TRUE 时进行 gsub() 替换,否则不替换。有什么建议么?请看下面的代码。谢谢。

aa <- data.frame(type = c("CONSTR", "MECH CONSTRUCTION", "MECHANICAL CONSTRUCTION MECH", "MECH CONSTR", "MECHCONSTRUCTION"))

from <- c("MECH", "MECHANICAL", "CONSTR",  "CONSTRUCTION")
to <- c("MECHANICAL", "MECHANICAL", "CONSTRUCTION", "CONSTRUCTION")

gsub2 <- function(pattern, replacement, x, ...) {
  for(i in 1:length(pattern)){
    reg <- paste0("(^", pattern[i], "$)|(^", pattern[i], " )|( ", pattern[i], "$)|( ", pattern[i], " )")
    ifelse(grepl(reg, aa$type),
           x <- gsub(pattern[i], replacement[i], x, ...),
           aa$type)
  }
  x
}

aa$title3 <- gsub2(from, to, aa$type)
4

3 回答 3

2

您可以将字符串包含在from向量中\\<\\>仅匹配整个单词:

x <- c("CONSTR", "MECH CONSTRUCTION", "MECHANICAL CONSTRUCTION MECH", 
       "MECH CONSTR", "MECHCONSTRUCTION")

from <- c("\\<MECH\\>", "\\<CONSTR\\>")
to <- c("MECHANICAL", "CONSTRUCTION")

for(i in 1:length(from)){
  x <- gsub(from[i], to[i], x)
}

print(x)
# [1] "CONSTRUCTION"                       "MECHANICAL CONSTRUCTION"           
# [3] "MECHANICAL CONSTRUCTION MECHANICAL" "MECHANICAL CONSTRUCTION"           
# [5] "MECHCONSTRUCTION"
于 2013-08-15T13:18:21.180 回答
0

我使用正则表达式(?<=\W|^)MECH(?=\W|$)来获取字符串内部是否包含这样的整个单词MECH

那是你需要的吗?

于 2013-08-15T13:09:46.337 回答
0

只是为了后代,除了使用\< \>附件之外,整个单词可以定义为以空格或行尾 ( \s|$) 结尾的任何字符串。

gsub("MECH(\\s|$)", "MECHANICAL\\1", aa$type)

这种方法的唯一问题是您需要继承您在匹配中使用的空格或行尾,因此需要括号中的封装和反向引用 ( \1)。

对于这个\< \>特定的问题,外壳是优越的,因为你没有特殊的例外。但是,如果您有异常,最好使用更明确的方法。工具箱中的工具越多越好。

于 2013-08-15T13:30:12.917 回答