为什么标点符号的 R gsub(或正则表达式)没有得到所有标点符号?

Bri*_*n P 3 regex r character-encoding

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

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

任何有关处理此问题的建议将不胜感激!

Cas*_*yte 5

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

gsub("(*UCP)(*UTF)[[:punct:]]", "", X1, perl=T)
Run Code Online (Sandbox Code Playgroud)

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

注意2:你可以这样做:

gsub("(*UTF)\\pP+", "", X1, perl=T)
Run Code Online (Sandbox Code Playgroud)

因为\pP是所有 unicode 标点字符的简写,所以(*UCP)变得无用。