为什么标点符号的 R gsub(或正则表达式)没有得到所有标点符号?
Why R gsub (or regexp) for punctuation doesn't get all punctuation?
我正在清理基于文本的数据文件,但无法弄清楚为什么 gsub("[[:punct:]]", "", X1)
没有给出所有标点符号的匹配项。不幸的是,我不能在这里重现这个问题,这让我认为这是一个字符编码问题——有问题的标点符号的外观明显不同于标准 ASCII。
这个问题是我读完资料就可以解决的,还是必须在前端做点什么?例如,Hadley 关于编码问题的 post 让我觉得我需要在读取文件时指定编码语句。但是,我正在从一个文件夹中读取一堆不同的 txt 文件,所以我不确定最好的解决方案。基本上,我只想保留所有字母 [A-Za-z] 并排除其他所有字母。 (也就是说,gsub([^A-Za-z], "", X1)
也不起作用!)
如有任何关于处理此问题的建议,我们将不胜感激!
可能标点字符超出了ascii范围。默认情况下 [[:punct:]]
只包含 ascii 标点字符。但是您可以使用 (*UCP)
指令将 class 扩展为 unicode。但这还不够,您需要通知正则表达式引擎它必须将目标字符串读取为具有 (*UTF)
的 utf 编码字符串(否则多字节编码的字符将被视为几个字节个字符)。所以:
gsub("(*UCP)(*UTF)[[:punct:]]", "", X1, perl=T)
注意:这两个指令仅存在于 perl 模式中,并且必须位于模式的最开头。
注2:你也可以这样做:
gsub("(*UTF)\pP+", "", X1, perl=T)
因为 \pP
是所有 unicode 标点字符的 shorthand,所以 (*UCP)
变得无用。
我正在清理基于文本的数据文件,但无法弄清楚为什么 gsub("[[:punct:]]", "", X1)
没有给出所有标点符号的匹配项。不幸的是,我不能在这里重现这个问题,这让我认为这是一个字符编码问题——有问题的标点符号的外观明显不同于标准 ASCII。
这个问题是我读完资料就可以解决的,还是必须在前端做点什么?例如,Hadley 关于编码问题的 post 让我觉得我需要在读取文件时指定编码语句。但是,我正在从一个文件夹中读取一堆不同的 txt 文件,所以我不确定最好的解决方案。基本上,我只想保留所有字母 [A-Za-z] 并排除其他所有字母。 (也就是说,gsub([^A-Za-z], "", X1)
也不起作用!)
如有任何关于处理此问题的建议,我们将不胜感激!
可能标点字符超出了ascii范围。默认情况下 [[:punct:]]
只包含 ascii 标点字符。但是您可以使用 (*UCP)
指令将 class 扩展为 unicode。但这还不够,您需要通知正则表达式引擎它必须将目标字符串读取为具有 (*UTF)
的 utf 编码字符串(否则多字节编码的字符将被视为几个字节个字符)。所以:
gsub("(*UCP)(*UTF)[[:punct:]]", "", X1, perl=T)
注意:这两个指令仅存在于 perl 模式中,并且必须位于模式的最开头。
注2:你也可以这样做:
gsub("(*UTF)\pP+", "", X1, perl=T)
因为 \pP
是所有 unicode 标点字符的 shorthand,所以 (*UCP)
变得无用。