为什么R gsub(或regexp)标点符号没有得到所有标点符号?

时间:2015-03-11 00:32:32

标签: regex r character-encoding

我正在努力清理基于文本的数据文件,但无法弄清楚为什么gsub("[[:punct:]]", "", X1)没有为所有标点符号提供匹配。不幸的是,我无法在这里复制问题,这让我觉得这是一个字符编码问题 - 所讨论的标点符号的外观明显不同于标准ASCII。

这是我在阅读文件后可以解决的问题,还是我必须在前端做一些事情?例如,关于编码问题的Hadley post让我觉得我需要在读取文件时指定编码语句。但是,我正在从一个文件夹中读取一堆不同的txt文件,所以我不确定最佳解决方案。基本上,我只想保留所有字母[A-Za-z]并排除其他所有字母。 (也就是说,gsub([^A-Za-z], "", X1)也不起作用!)

非常感谢任何有关处理此问题的建议!

1 个答案:

答案 0 :(得分:4)

标点符号可能超出了ascii范围。默认情况下,[[:punct:]]仅包含ascii标点字符。但是您可以使用(*UCP)指令将类扩展为unicode。但这还不够,你需要通知正则表达式引擎它必须将目标字符串作为带有(*UTF) 的utf编码字符串读取(否则多字节编码字符将被视为几个字节字符)的。所以:

gsub("(*UCP)(*UTF)[[:punct:]]", "", X1, perl=T)

注意:这两个指令仅存在于perl模式中,并且必须处于模式的最开始。

注2:你可以这样做:

gsub("(*UTF)\\pP+", "", X1, perl=T)

由于\pP是所有unicode标点符号的简写,(*UCP)变得无用。