我刚开始重新使用 R,想知道是否有一种方法可以使用通配符替换字符串的一部分。
例如:
假设我有一个字符串
S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa"
我希望你能够将方括号内的所有内容替换为'x',从而得到新字符串
"aaaaaaaaa[x]aaaa[x]aaaa"
这个在R中是否可能实现?
请注意方括号内的内容长度可变。
\\[.+?\\]
例子 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"
你也可以尝试使用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"
请使用如下的正向预查和反向预查:
```"(?<=\\[)[^\\[\\]]*(?=\\])"
然后用x
替换匹配的字符。
> S1<-'aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa'
> gsub("(?<=\\[)[^\\[\\]]*(?=\\])", "x", S1, perl=TRUE)
[1] "aaaaaaaaa[x]aaaa[x]aaaa"
说明:
(?<=\\[)
正向先行断言,表示要匹配的字符串必须在 [
符号之前。[^\\[\\]]*
匹配任何字符,但不能是 [
或 ]
字符,出现零次或多次。(?=\\])
正向后行断言,表示匹配必须在 ]
符号之前。aaaaaaaaa[]aaaa[bbbbbbb]aaaa
无效。无论如何,您都可以将您的答案包装成类似 gsub("\\[[^\\]]+", "[x", s1, perl = TRUE)
的形式。 - David Arenburg
*
替换+
。 - Cath*
),但你更快。现在,我可以点赞了;-) - Cath