消除重复的连续元素
假设我们想要从字符串中消除重复的子序列元素(它可以不止一个)。例如:
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"
我们来解释一下正则表达式:
(\\d+)
:由()分隔的组 1,找到任何数字(至少一个)。记住我们需要在这里使用双反斜杠(\\
),因为对于字符变量,反斜杠表示文字字符串分隔符(\"
或\'
)的特殊转义字符。\d\
相当于:[0-9]
。,
:标点符号:,
(我们可以包含空格或任何其他分隔符)\\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"
>
然后,上述模式包括作为特定情况的重复数字情况。