我正在努力清理基于文本的数据文件,但无法弄清楚为什么gsub("[[:punct:]]", "", X1)
没有为所有标点符号提供匹配。不幸的是,我无法在这里复制问题,这让我觉得这是一个字符编码问题 - 所讨论的标点符号的外观明显不同于标准ASCII。
这是我在阅读文件后可以解决的问题,还是我必须在前端做一些事情?例如,关于编码问题的Hadley post让我觉得我需要在读取文件时指定编码语句。但是,我正在从一个文件夹中读取一堆不同的txt文件,所以我不确定最佳解决方案。基本上,我只想保留所有字母[A-Za-z]并排除其他所有字母。 (也就是说,gsub([^A-Za-z], "", X1)
也不起作用!)
非常感谢任何有关处理此问题的建议!
答案 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)
变得无用。