R:删除字符串开头和结尾的数字

时间:2014-10-14 11:07:01

标签: r vector numbers

我有以下矢量:

words <- c("5lang","kasverschil2","b2b")

我想删除"5"中的"5lang""2"中的"kasverschil2"。但我不想删除"2"中的"b2b"

3 个答案:

答案 0 :(得分:11)

 gsub("^\\d+|\\d+$", "", words)    
 #[1] "lang"        "kasverschil" "b2b"

另一种选择是使用stringi

 library(stringi)
 stri_replace_all_regex(words, "^\\d+|\\d+$", "")
  #[1] "lang"        "kasverschil" "b2b"        

使用OP提供的数据集的变体这里是3个主要解决方案的基准(请注意,这些字符串非常短且设计;结果可能在较大的实际数据集上有所不同):

words <- rep(c("5lang","kasverschil2","b2b"), 100000)

library(stringi)
library(microbenchmark)

GSUB <- function() gsub("^\\d+|\\d+$", "", words)
STRINGI <- function() stri_replace_all_regex(words, "^\\d+|\\d+$", "")
GREGEXPR <- function() {
    gregexpr(pattern='(^[0-9]+|[0-9]+$)', text = words) -> mm
    sapply(regmatches(words, mm, invert=TRUE), paste, collapse="") 
}

microbenchmark( 
    GSUB(),
    STRINGI(),
    GREGEXPR(),
    times=100L
)

## Unit: milliseconds
##        expr       min        lq    median        uq       max neval
##      GSUB()  301.0988  349.9952  396.3647  431.6493  632.7568   100
##   STRINGI()  465.9099  513.1570  569.1972  629.4176  738.4414   100
##  GREGEXPR() 5073.1960 5706.8160 6194.1070 6742.1552 7647.8904   100

答案 1 :(得分:1)

获取数字出现在单词的开头或结尾并与其他所有内容匹配的实例。您需要折叠结果,因为可能存在多个匹配项:

gregexpr(pattern='(^[0-9]+|[0-9]+$)', text = words) -> mm
sapply(regmatches(words, mm, invert=TRUE), paste, collapse="") 

答案 2 :(得分:1)

您可以使用使用正则表达式的gsub

gsub("^[0-9]|[0-9]$", "", words)
# [1] "lang"        "kasverschil" "b2b"

说明:

模式^[0-9]匹配字符串开头的任何数字,而模式[0-9]$匹配字符串末尾的任何数字。通过|分隔这两个模式,你想要匹配第一个或第二个模式。然后,用空字符串替换匹配的模式。