我正在清理基于文本的数据文件,但无法弄清楚为什么gsub("[[:punct:]]", "", X1)
没有给出所有标点符号的匹配。不幸的是,我无法在这里复制这个问题,这让我认为这是一个字符编码问题——有问题的标点符号的外观与标准 ASCII 明显不同。
这是我读入文件后就可以解决的问题,还是我必须在前端做一些事情?例如,哈德利的post https://stackoverflow.com/questions/13496059/how-to-determine-the-correct-file-encoding-for-use-with-read-fwf-or-use-a-worka关于编码问题让我认为我在读取文件时需要指定编码语句。但是,我正在从一个文件夹中读取一堆不同的 txt 文件,所以我不确定最好的解决方案。基本上,我只想保留所有字母 [A-Za-z] 并排除其他所有字母。 (也就是说,gsub([^A-Za-z], "", X1)
也不起作用!)
任何有关处理此问题的建议将不胜感激!
标点符号可能超出了 ascii 范围。默认情况下[[:punct:]]
仅包含 ascii 标点符号。但是您可以使用以下命令将类扩展为 unicode(*UCP)
指示。但这还不够,您需要通知正则表达式引擎它必须将目标字符串读取为 utf 编码字符串(*UTF)
(否则多字节编码的字符将被视为几个单字节字符). So:
gsub("(*UCP)(*UTF)[[:punct:]]", "", X1, perl=T)
注意:这两个指令仅存在于 perl 模式中,并且必须位于模式的最开始处。
注意2:你也可以这样做:
gsub("(*UTF)\\pP+", "", X1, perl=T)
Because \pP
是所有 unicode 标点字符的简写,(*UCP)
变得无用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)