我刚开始再次使用R,我想知道有没有办法用通配符替换部分字符串。
例如:
说我有
S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa"
我希望用'x'替换方括号内的所有内容,以便新字符串
"aaaaaaaaa[x]aaaa[x]aaaa"
这可以在R吗?
请注意方括号中的内容可以是可变长度。
答案 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)