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

6

我刚开始重新使用 R,想知道是否有一种方法可以使用通配符替换字符串的一部分。

例如:

假设我有一个字符串

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

我希望你能够将方括号内的所有内容替换为'x',从而得到新字符串

"aaaaaaaaa[x]aaaa[x]aaaa" 

这个在R中是否可能实现?

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

4个回答

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
(+1) 这个不错 - David Arenburg
@DavidArenburg 感谢您的编辑。我会在答案中添加更多细节。 - nu11p01n73R
4
如果括号中间没有任何内容,比如说 "aaa[]aaa[bbb]",那该怎么办呢?也许你可以用 * 替换 + - Cath
@nu11p01n73R,不客气,那正是我想发布的答案(带有*),但你更快。现在,我可以点赞了;-) - Cath
@CathG :D 谢谢。 - nu11p01n73R
显示剩余2条评论

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
谢谢,需要添加另一个库。 :) - dkr267

3
请使用如下的正向预查和反向预查:
```html

请使用如下的正向预查和反向预查:

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

然后用x替换匹配的字符。

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

说明:

  • (?<=\\[) 正向先行断言,表示要匹配的字符串必须在 [ 符号之前。
  • [^\\[\\]]* 匹配任何字符,但不能是 [] 字符,出现零次或多次。
  • (?=\\]) 正向后行断言,表示匹配必须在 ] 符号之前。

这里使用lookarounds并不过度。 - Avinash Raj

0
\\[[^\\]]+

您可以简单地完成这个任务,无需使用前瞻或其他技巧。将其替换为[x。请参见演示。

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


不过对于 aaaaaaaaa[]aaaa[bbbbbbb]aaaa 无效。无论如何,您都可以将您的答案包装成类似 gsub("\\[[^\\]]+", "[x", s1, perl = TRUE) 的形式。 - David Arenburg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接