消除重复的连续元素

假设我们想要从字符串中消除重复的子序列元素(它可以不止一个)。例如:

2,14,14,14,19

并将其转换为:

2,14,19

使用 gsub,我们可以实现它:

gsub("(\\d+)(,\\1)+","\\1", "2,14,14,14,19")
[1] "2,14,19"

它也适用于多个不同的重复,例如:

 > gsub("(\\d+)(,\\1)+", "\\1", "2,14,14,14,19,19,20,21")
[1] "2,14,19,20,21"

我们来解释一下正则表达式:

  1. (\\d+):由()分隔的组 1,找到任何数字(至少一个)。记住我们需要在这里使用双反斜杠(\\),因为对于字符变量,反斜杠表示文字字符串分隔符(\"\')的特殊转义字符。\d\相当于:[0-9]
  2. ,:标点符号:,(我们可以包含空格或任何其他分隔符)
  3. \\1:与组 1 相同的字符串,即:重复的数字。如果没有发生,则模式不匹配。

让我们尝试类似的情况:消除连续重复的单词:

one,two,two,three,four,four,five,six

然后,只需用\w 替换\d,其中\w 匹配任何单词字符,包括:任何字母,数字或下划线。它相当于 [a-zA-Z0-9_]

> gsub("(\\w+)(,\\1)+", "\\1", "one,two,two,three,four,four,five,six")
[1] "one,two,three,four,five,six"
> 

然后,上述模式包括作为特定情况的重复数字情况。