它假设非常简单。 例如:
a = "fafasdf..", b = "sdfs?>", c = "safwe"
我想要的结果是
a = "fafasdf", b = "sdfs", c = "safwe"
如果它们是标点符号,如何删除最后几个字符?
我试过了sub("[:punct:]\Z", "", mystring)
,但它不起作用......
答案 0 :(得分:4)
你快到了,
sub("[[:punct:]]+$", "", mystring)
您需要将[:punct:]
置于字符类中,并通过在其旁边添加+
使其重复一次或多次。并且还将\Z
替换为$
,因为没有perl=TRUE
param的sub将不支持\Z
(与字符串边界的末尾匹配)
示例:的
x <- c("fafasdf..", "sdfs?>", "safwe")
sub("[[:punct:]]+$", "", x)
# [1] "fafasdf" "sdfs" "safwe"
如果您确实想使用\\Z
,请启用perl=TRUE
参数。
sub("[[:punct:]]+\\Z", "", x, perl=TRUE)
# [1] "fafasdf" "sdfs" "safwe"
答案 1 :(得分:2)
POSIX字符类需要包含在括号内的表达式中,正确的语法是[[:punct:]]
。而且,由于您未使用gsub
删除所有实例,因此您需要指定operator以匹配多个标点符号。
在另一个答案中评论;需要将perl = TRUE
参数设置为使用\Z
。
但是为了将来的参考 - 不要劝阻你,这个锚的行为会有所不同,具体取决于所使用的引擎;在R中用参数集表示,该锚点将允许在最后一个换行符之前进行匹配。但是,在这里使用它可以,但我只想坚持$
。
sub('[[:punct:]]+$', '', c('fafasdf..', 'sdfs?>', 'safwe'))
## [1] "fafasdf" "sdfs" "safwe"
还要考虑&#39; locale&#39;,它可能会影响POSIX类的行为。如果这成为问题,您可以阅读此前answered个问题。
如果您只想删除非单词字符,可以使用:
sub('\\W+$', '', c('fafasdf..', 'sdfs?>', 'safwe'))
## [1] "fafasdf" "sdfs" "safwe"