【问题标题】:R: Finding a repeated pattern with grep/gsubR:使用 grep/gsub 查找重复模式
【发布时间】:2014-09-29 10:24:33
【问题描述】:

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

想法?

【问题讨论】:

  • lapply(strsplit(z,";"),anyDuplicated) 这样的东西肯定会帮助你做你想做的事......
  • 只使用gsub 的好答案发生了什么:我认为它类似于gsub("([^;]*;)\\1;?", "\\1", z)
  • @VincentGuillemot,这是正确的解决方案,将其作为答案发布
  • @VincentGuillemot 和每个人 - 你是对的 - 我搞砸了正则表达式,因为我预计模式中有两个 ;
  • 我不能相信这个答案:它是在几分钟前发布的,但神秘地消失了。甚至还有一个demo here。我刚刚添加了“?”...

标签: regex r gsub


【解决方案1】:

我建议使用gsub对先前的答案进行以下修改

gsub("([^;]*;)\\1;?", "\\1", z)

这个也有效,也许更正确

gsub("([^;]*;)\\1", "\\1", z)

【讨论】:

    【解决方案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;" 
    

    【讨论】:

    • 我认为 op 想要 ; 之后到 mnop
    • 一种“不好”的方法是在折叠之前人为地在向量末尾添加一个空字符串:sapply(strsplit(z, ";"), function(x) paste(c(unique(x),""), collapse = ";"))
    • 因为它删除了终端 ; 我可以只 paste0 它回到每个字符串的后端。虽然这可行,但我希望有一些更通用的东西,可以与 grep/grepl 一起使用,以识别那些重复的字符串。想法?
    • @VincentGuillemot,这只是作为一种解决方法提出的,您应该发布您的 gsub 解决方案,因为它似乎是正确的解决方案
    • 可以使用(?&lt;=;)分割字符串或者;\K
    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2021-07-26
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多