R - 使用通配符替换字符串的一部分

时间:2014-12-02 09:50:27

标签: regex r

我刚开始再次使用R,我想知道有没有办法用通配符替换部分字符串。

例如:

说我有

S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa" 

我希望用'x'替换方括号内的所有内容,以便新字符串

"aaaaaaaaa[x]aaaa[x]aaaa" 

这可以在R吗?

请注意方括号中的内容可以是可变长度。

4 个答案:

答案 0 :(得分:9)

一个简单的正则表达式就像

\\[.+?\\]

示例 http://regex101.com/r/xE1rL1/1

使用示例

s1 <- 'aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa'
gsub("\\[.+?\\]", "[x]", s1)
## [1] "aaaaaaaaa[x]aaaa[x]aaaa"

正则表达式

  • \\[匹配开始[

  • .+?非贪婪的任何匹配

  • \\]匹配结束]

修改

为安全起见,如果[]中没有任何内容,则可以将正则表达式略微修改为

s1 <- 'aaaaaaaaa[]aaaa[bbbbbbb]aaaa'
gsub("\\[.*?\\]", "[x]", s1)
##[1] "aaaaaaaaa[x]aaaa[x]aaaa"

答案 1 :(得分:5)

还可以尝试qdapRegex包,其中包含针对此类问题的特殊方法:rm_square

library(qdapRegex)
S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa" 
rm_square(S1, replacement = "[x]")
## [1] "aaaaaaaaa[x]aaaa[x]aaaa"

对于空括号

将起作用
S1 <- "aaaaaaaaa[]aaaa[bbbbbbb]aaaa" 
rm_square(S1, replacement = "[x]")
## [1] "aaaaaaaaa[x]aaaa[x]aaaa"

答案 2 :(得分:3)

使用正向前瞻和后面的断言,如下所示。

"(?<=\\[)[^\\[\\]]*(?=\\])"

然后将匹配的字符替换为x

> S1<-'aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa'
> gsub("(?<=\\[)[^\\[\\]]*(?=\\])", "x", S1, perl=TRUE)
[1] "aaaaaaaaa[x]aaaa[x]aaaa"

<强>解释

  • (?<=\\[)肯定的后瞻断言,您要匹配的字符串必须以[符号开头。
  • [^\\[\\]]*匹配任何字符,但不匹配[]零次或多次。
  • (?=\\])肯定前瞻声明匹配必须后跟]符号。

答案 3 :(得分:0)

\\[[^\\]]+

你可以简单地做到这一点而不用前瞻或者什么。按[x替换。见演示。

http://regex101.com/r/yR3mM3/13