2016-03-01 127 views
5

我試圖用gsub替換我認爲是標準破折號的東西。我測試的代碼是:帶特殊字符的R gsub

gsub("-", "ABC", "reported – estimate")

這什麼都不做,雖然。我複製並粘貼到http://unicodelookup.com/#–/1破折號,它似乎是一個破折號。該網站提供了一個破折號的十六進制,十進制等代碼,我一直試圖替換破折號,但沒有運氣。建議?

(作爲獎勵,如果你能告訴我是否有函數來識別特殊字符會有幫助)。

我不確定是否SO的代碼格式會改變破折號格式,所以這裏是我使用的破折號( - )。

回答

4

您可以通過在正則表達式模式中指定它來替換連字符。

gsub("–", "ABC", "reported – estimate") 

可以匹配所有的連字符,恩與

gsub("[-–—]", "ABC", "reported – estimate — more - text") 

em短線見IDEONE demo

要檢查是否有一個字符串非ASCII字符,使用

> s = "plus ça change, plus c'est la même chose" 
> gsub("[[:ascii:]]+", "", s, perl=T) 
[1] "çê" 

請參閱this IDEONE demo

您將得到一個空結果(如果一個字符串只包含「單詞」字符和空格),或者 - 如同這裏 - 一些「特殊」字符。

+0

這太好了。也許我沒有用「特殊字符」來使用正確的術語。我的意思是不是標準的UTF-8字符。例如,ô - 當使用readr :: write_csv()導出時,我發現這些字符看起來很奇怪。您可以修改gsub以將「ô」識別爲「特殊字符」。 – ZRoss

+1

你可以用正則表達式來匹配所有ascii:'gsub(「[[:ascii:]] +」,「」,s)'。這將從字符串中刪除所有ASCII字符,保留結果中的所有Unicode字符。 –

+0

因爲這是一個PCRE構造,所以你只需要將'perl = T'用於上面的正則表達式模式。 –

2

對於特殊字符替換,你可以做一個負面補充。

gsub('[^\\w]*', 'ABC', 'reported - estimate', perl = True)將用ABC替換所有特殊字符。 [^ \ w]是一種表示任何不是正常字符的模式。