R:使用grep / gsub查找重复模式

时间:2014-08-06 13:02:11

标签: regex r gsub

我正在尝试使用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;"

想法?

2 个答案:

答案 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)