为什么在使用R的gsub(或正则表达式)去除标点符号时,无法去除所有标点符号?

3
我正在清理一个基于文本的数据文件,但无法弄清楚为什么gsub("[[:punct:]]", "", X1)不能匹配所有标点符号。不幸的是,我无法在这里复制该问题,这使我认为这是一个字符编码问题——相关的标点符号与标准ASCII明显不同。
这是一个我可以在读取文件后解决的问题吗?还是我需要在前端做些什么?例如,Hadley的post关于编码问题让我觉得我需要在读取文件时指定编码语句。然而,我正在从文件夹中读取一堆不同的txt文件,所以我不确定最佳解决方案。基本上,我只想保留所有字母[A-Za-z]并排除其他所有内容。(也就是说,gsub([^A-Za-z], "", X1)也不起作用!)
非常感谢您提供处理此问题的任何建议!

你可以定义自己的字符类,包括任何你需要的标点符号,或者使用gsub('[.,:]', '', '.,:?;')来去除标点符号,这个方法可行吗? - rawr
我认为这可能可行,但解决方案无法扩展。我有许多不同格式的字符需要处理。我的希望是能够丢弃每个不是字母的字符。 - Brian P
那么正确的写法应该是 gsub('\\W', '', 'fasdfa.,:asdf?;adfa'),对吗? - rawr
这就是我试图弄清楚的事情!解决方案没有捕获那些字符... - Brian P
啊,那不是标点符号。 - rawr
gsub("[^A-Za-z]", "", X1) 的问题在哪里?当我在你的反例上尝试时,它似乎运行良好。 - IRTFM
1个回答

5

可能是标点符号字符超出了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)变得无用。

非常有用的功能,解释得非常好!谢谢。 - lawyeR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接