如何使用 gsub 在 for 循环中找到完全匹配?

Posted

技术标签:

【中文标题】如何使用 gsub 在 for 循环中找到完全匹配?【英文标题】:How to find the exact match in for loop using gsub? 【发布时间】:2019-08-19 23:29:26 【问题描述】:

我只想替换数据数据框中的确切术语。在下面的示例中,我试图用 xx 替换单词 java,但它替换了 javascript 以及 xxscript。

data$new
[1] "xxscript is a statically typed and xx py is a dynamically typed"
[2] "xx is a programming language" 
data = data.frame("word"=c('python', 'java'), 
                    "description"=c('Javascript is a statically typed and Python py is a dynamically typed',
                                    'java is a programming language'), stringsAsFactors = FALSE)

ll <- as.list(data$word)
data$new <- data$description
for(i in seq_len(nrow(data))) for(j in seq_along(ll)) 
    data$new[i] <- gsub(ll[j], "xx", data$new[i],ignore.case = T)

data$new

我希望只替换确切的条款。

【问题讨论】:

【参考方案1】:

使用单词边界\\b

gsub("\\bjava\\b", "xx", c("my java is", "this javascript is"))
#[1] "my xx is"           "this javascript is"

你可能想要

ll <- as.list(data$word)
data$new <- data$description
for(i in seq_len(nrow(data))) for(j in seq_along(ll)) 
    data$new[i] <- gsub(paste0("\\b", ll[j], "\\b"), "xx", data$new[i],ignore.case = T)

【讨论】:

【参考方案2】:

您可以通过将单词列表与或|sub 连接向量来删除两个循环:

data$new <- sub(paste0("\\b", ll, "\\b", collapse="|"), "xx", data$description, ignore.case = T)

要匹配单词,您可以使用@d-b 已经显示的边界\\b

【讨论】:

以上是关于如何使用 gsub 在 for 循环中找到完全匹配?的主要内容,如果未能解决你的问题,请参考以下文章

对于R gsub()中字符串内的索引的循环

当 for 循环中不匹配时退出 python 脚本

Zcat for循环中的多个压缩文件

Ruby regex- gsub 是不是存储它匹配的内容?

如何停止 JavaScript for 循环?

如果全局不起作用,在Python中访问for循环之外的变量?