2017-07-25 45 views
2

我有一个字符串,如下所示:更换使用正则表达式重复的字符串中的R

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试图(^[\w|.|:|\/]*),\1+ .com,它可以消除字符串的第一次重复(第二次失败)。但是,如果我口至R的gsub预期它不工作:

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

我试着perl = FALSETRUE无济于事。

我在做什么错?

+0

是这些重复的顺序,或乱序? – sln

+0

始终顺序 – PavoDive

回答

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 

注意 - 如果使用分裂和独特的再结合,你将失去的 项目的顺序。

+1

我只能看到文本中的2个不同的项目 – SymbolixAU

+0

我的错误,[尝试](https://regex101.com/r/FDzop9/1)现在。 – sln

+0

是的一切都好。在R代码中这是'gsub(pattern =“([\\ w。:/] +)(?:, \\ 1)+”,“\\ 1”,text,perl = TRUE)' – SymbolixAU

3

另一种方法是分裂的逗号的字符串,那么唯一的结果,然后再结合你的单一文本

paste0(unique(strsplit(text, ",")[[1]]), collapse = ",") 
# [1] "http://x.co/imag/xyz.png,http://x.co/imag/jpg.png" 
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