我有包含大量重复内容的字符串,就像这样:
tst <- c("C>C>C>B>B>B>B>C>C>*>*>*>*>*>C", "A>A>A", "*>B>B",
"A>A>A>A>A>*>A>A>A>*>*>*>*>A>A", "*>C>C", "A")
我希望删除所有连续的大写字母和“*”字符,因此预期结果是这样的:
[1] "CBC*C" "A" "*B" "A*A*A" "*C" "A"
我已成功提取了重复的大写字母:
library(stringr)
unlist(str_extract_all(gsub(">", "", tst), "(.)(?=\\1)"))
[1] "C" "C" "B" "B" "B" "C" "*" "*" "*" "*"
但是我在这里有些卡住了。我的直觉是函数which
可能有帮助,它返回索引,但不知道如何在这种情况下实现。
有什么想法吗?
编辑:
我自己距离解决方案并不远 - 只需使用负向先行断言(而不是正向先行断言)就可以解决问题:
str_extract_all(gsub(">", "", tst), "(.)(?!\\1)")
[[1]]
[1] "C" "B" "C" "*" "C"
[[2]]
[1] "A"
[[3]]
[1] "*" "B"
[[4]]
[1] "A" "*" "A" "*" "A"
[[5]]
[1] "*" "C"
[[6]]
[1] "A"
gsub("(.)\\1+", "\\1", gsub(">", "", "A>A>A>A"))# [1] "A"
,在gsub("(.)\\1+", "\\1", gsub(">", "", tst))# [1] "CBC*C"
上进行测试。 - akrungsub("(.)\\1+", "\\1", gsub(">", "", "A>A"))# [1] "A"
相比之下,gsub("((.)>)\\1+\\2*", "\\2", "A>A")# [1] "A>A"
- akrun