替换特殊字符(破折号)

6
我曾试图使用gsub替换我认为是标准破折号的符号。我测试的代码如下: gsub("-", "ABC", "reported – estimate") 然而,这并没有起作用。我将破折号复制粘贴到http://unicodelookup.com/#–/1,发现它似乎是一个英文破折号。该网站提供了英文破折号的十六进制、十进制等代码,我一直在尝试替换英文破折号,但没有成功。有什么建议吗?
(作为奖励,如果您能告诉我是否有一个函数来识别特殊字符,那会很有帮助)。
我不确定SO的代码格式是否会改变破折号的格式,所以这里是我使用的破折号(–)。
2个回答

6
您可以通过在正则表达式模式中指定它来替换en-dash。
gsub("–", "ABC", "reported – estimate")

您可以使用以下方法匹配所有连字符、短划线和长划线:

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

请查看IDEONE演示

要检查字符串中是否有非ASCII字符,请使用以下方法:

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

请参见这个IDEONE演示

如果一个字符串只由“单词”字符和空格组成,您将得到一个空结果,否则(就像这里一样)将得到一些“特殊”的字符。


这太棒了。也许我在使用“特殊字符”方面没有使用正确的术语。我的意思是指那些不是标准UTF-8的字符。例如,ô——这些是我发现在使用readr::write_csv()导出时看起来很奇怪的字符。您给出的gsub能否被修改以将“ô”识别为“特殊字符”? - ZRoss
1
你可以使用正则表达式来匹配所有的ASCII字符:gsub("[[:ascii:]]+", "", s)。这将从字符串中删除所有的ASCII字符,保留所有Unicode字符在结果中。 - Wiktor Stribiżew
你只需要在上述正则表达式模式中使用 perl=T,因为这是一个PCRE结构。 - Wiktor Stribiżew

3

对于特殊字符替换,你可以使用负补集。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接