搜索&在[和]之间将它封闭后,替换字符串中多次出现的模式

时间:2017-02-26 11:10:19

标签: r

尝试在字符串中包含模式后,在长字符串("AxB"可以是任何单词字符)中搜索和替换多个模式,例如"AxxB""x""["前缀和"]"例如"[AxB]""[AxxB]",如下例所示。

A B 之间可能出现任何单词字符以及任意数量的单词字符。我只能找到模式但不知道如何通过使用gsub()和可能的paste()函数为模式添加前缀和后缀来替换它。有没有办法实现这个目标?

转换以下字符串:

"CCBCACBAHGABGGARBJDFDFADFDFBFDFD"来  "CCBC[ACB]AHG[AB]GG[ARB]JDFDF[ADFDFB]FDFD"

3 个答案:

答案 0 :(得分:3)

在我们到达gsub之前,使用A匹配A后跟最少数量的非B的其他字符。将匹配替换为方括号包围的匹配。下面,x是输入字符串(如在问题中并在最后的注释中重复)但它可能是这种字符串的字符向量,例如c(x, x),它应该仍然有效。没有包使用。

gsub("(A[^A]*?B)", "[\\1]", x)
## [1] "CCBC[ACB]AHG[AB]GG[ARB]JDFDF[ADFDFB]FDFD"

注意:

x <- "CCBCACBAHGABGGARBJDFDFADFDFBFDFD"

答案 1 :(得分:2)

txt <- "CCBCACBAHGABGGARBJDFDFADFDFBFDFD"
expected <- "CCBC[ACB]AHG[AB]GG[ARB]JDFDF[ADFDFB]FDFD"

# Find matches.
matches <- regmatches(txt, gregexpr("(?=A).*?(?<=B)", txt, perl=TRUE))[[1]]
matches <- matches[matches != ""]

# Iterate through and make replacements.
for(match in matches){
  txt <- gsub(match, paste0("\\[", match, "\\]"), txt)
}

txt == expected # TRUE

我确定有更好的方法来完成gsub部分。

答案 2 :(得分:0)

使用stringr包(可以使用gsub完成类似的操作:

library(stringr)
string <- "CCBCACBAHGABGGARBJDFDFADFDFBFDFD"
str_replace_all(string, pattern = "(A.*?B)", "[\\1]")