如果是标点符号,如何删除字符串的最后一个字符?

时间:2015-11-15 01:45:09

标签: regex r grep

它假设非常简单。 例如:

a = "fafasdf..", b = "sdfs?>", c = "safwe"

我想要的结果是

a = "fafasdf", b = "sdfs", c = "safwe"

如果它们是标点符号,如何删除最后几个字符? 我试过了sub("[:punct:]\Z", "", mystring),但它不起作用......

2 个答案:

答案 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"