消除重複的連續元素
假設我們想要從字串中消除重複的子序列元素(它可以不止一個)。例如:
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"
>
然後,上述模式包括作為特定情況的重複數字情況。