2016-03-01 130 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]是一种表示任何不是正常字符的模式。