在R

时间:2017-07-25 00:39:02

标签: r regex gsub

我有一个字符串如下:

text <- "http://x.co/imag/xyz.png,http://x.co/imag/xyz.png,http://x.co/imag/xyz.png,http://x.co/imag/jpg.png"

我想删除所有重复的地址,因此我的预期结果是:

expected <- "http://x.co/imag/xyz.png,http://x.co/imag/jpg.png"

我在regex101.com中尝试了(^[\w|.|:|\/]*),\1+,它可以删除字符串的第一次重复(第二次失败)。但是,如果我将其移植到R gsub,它就不会按预期工作:

gsub("(^[\\w|.|:|\\/]*),\\1+", "\\1", text)

我已尝试perl = FALSETRUE无效。

我做错了什么?

3 个答案:

答案 0 :(得分:4)

如果它们是连续的,您只需稍微修改您的正则表达式。

取出你的BOS主播^ 在逗号和反向引用周围添加一个群集组,然后量化它(?:,\1)+ 并且,丢失管道符号|,就像它只是一个文字一样。

([\w.:/]+)(?:,\1)+

https://regex101.com/r/FDzop9/1

 ( [\w.:/]+ )         # (1), The adress
 (?:                  # Cluster
      , \1                 # Comma followed by what found in group 1 
 )+                   # Cluster end, 1 to many times

注意 - 如果你使用split和unique然后组合,你将失去排序 这些物品。

答案 1 :(得分:3)

另一种方法是将字符串拆分为逗号,然后将结果唯一,然后为单个文本重新组合

paste0(unique(strsplit(text, ",")[[1]]), collapse = ",")
# [1] "http://x.co/imag/xyz.png,http://x.co/imag/jpg.png"

答案 2 :(得分:0)

text <- c("http://x.co/imag/xyz.png,http://x.co/imag/xyz.png,http://x.co/imag/xyz.png,http://x.co/imag/jpg.png",
          "http://q.co/imag/qrs.png,http://q.co/imag/qrs.png")
df <- data.frame(no = 1:2, text)

如果您的字符串位于数据框中,则可以使用tidyverse中的函数:

library(tidyverse)
separate_rows(df, text, sep = ",") %>% 
  distinct %>% 
  group_by(no) %>% 
  mutate(text = paste(text, collapse = ",")) %>% 
  slice(1)

输出结果为:

#     no                                              text
#   <int>                                             <chr>
# 1     1 http://x.co/imag/xyz.png,http://x.co/imag/jpg.png
# 2     2                          http://q.co/imag/qrs.png