我有一个字符串如下:
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 = FALSE
和TRUE
无效。
我做错了什么?
答案 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