我正在尝试使用R中的grep和gsub命令来查找字符串中的重复块。例如,我可能会有这样的事情......
z <- c("ab;cd;ef;gh;ij;kl;mn;mn;", "ab;cd;ef;gh;ij;kl;op;")
我想识别在分号之间有重复子串的字符串。所以在这种情况下,我想回到z [1],也许稍后将其改为“ab; cd; ef; gh; ij; kl; mn;”。我知道我可以使用gsub中的内存插槽来做类似的事情......
gsub("(.*mn;).*;", "\\1", z)
但是当我不知道重复在哪里或重复的子串是什么时,这将无效。我想做的就是这样......
gsub(";([^;]*;)\\1;", "\\1", z)
要产生这个......
[1] "ab;cd;ef;gh;ij;kl;mn;" "ab;cd;ef;gh;ij;kl;op;"
想法?
答案 0 :(得分:2)
我会做这样的事情
sapply(strsplit(z, ";"), function(x) paste(unique(x), collapse = ";"))
## [1] "ab;cd;ef;gh;ij;kl;mn" "ab;cd;ef;gh;ij;kl;op"
更好的版本(感谢@CasimiretHippolyte)
sapply(strsplit(z, "(?<=;)", perl = T), function(x) paste(unique(x), collapse = ""))
## [1] "ab;cd;ef;gh;ij;kl;mn;" "ab;cd;ef;gh;ij;kl;op;"
答案 1 :(得分:2)
我建议使用gsub
gsub("([^;]*;)\\1;?", "\\1", z)
这个也有效,可能更正确
gsub("([^;]*;)\\1", "\\1", z)