2017-04-30 24 views
1

我使用反向引用來擺脫變量名向量中的意外重複。我遇到的第一種情況下的名稱具有類似的重複模式R正則表達式匹配/省略幾個重複

x <- c("gender_gender-1", "county_county-2", "country_country-1997", 
     "country_country-1993") 

重複總是由下劃線分隔,並且只有一個重複消除。它們總是從文本的開頭開始。檢查正則表達式食譜,2ED後,我來到了問題的解答:

> gsub("^(.*?)_\\1", "\\1", x) 
[1] "gender-1"  "county-2"  "country-1997" "country-1993" 

我很擔心未來的情況下,可能有破折號或空格作爲分隔符,所以我想概括了一下匹配。我解決了這個問題。

> x <- c("gender_gender-1", "county-county-2", "country country-1997", 
+  "country,country-1993") 
> gsub("^(.*?)[,_\ -]\\1", "\\1", x) 
[1] "gender-1"  "county-2"  "country-1997" "country-1993" 

到目前爲止,總勝利。

現在,如果在某些情況下有三個重複,那麼正確的修正是什麼?在這一個中,我希望「鄉村國家」成爲一個「國家」。

> x <- c("gender_gender-1", "county-county-county-2") 
> gsub("^(.*?)[,_\ -]\\1", "\\1", x) 
[1] "gender-1"  "county-county-2" 

我願意用「_」替代所有的分隔符,如果這樣可以更容易地擺脫重複的單詞。

回答

4

您可以量化[,_ -]\1部分:

gsub("^(.*?)(?:[,_\\s-]\\1)+", "\\1", x) 

R demo

注意我也\s替代空間來匹配任何空白。

詳細

  • ^ - 一個字符串的開始
  • (.*?)匹配 - 任何0+字符儘可能少到第一...
  • (?:
    • [,_\\s-] - ,_,空格或次或更多次 -
    • \\1 - 如在第1組
  • )+捕獲相同的值。

如果你只是想重複部分1〜2次匹配,更換+{1,2}限制量詞:

gsub("^(.*?)(?:[,_\\s-]\\1){1,2}", "\\1", x) 
+0

是什麼的'用處/含義:'? – Gilles

+1

@Gilles:'(?:...)'是一個[非捕獲組](http://stackoverflow.com/questions/3512471/what-is-a-non-capturing-group-what-does-一個-問號-隨後逐一個冒號)。它僅用於對子模式進行分組,而不將子匹配保留在內存中。 –

+0

謝謝。這將花費我很長時間才能弄清楚。 – pauljohn32