gsub / sub для извлечения между определенными символами

#r #regex

#r #регулярное выражение

Вопрос:

Как я могу извлечь числа / идентификатор из следующей строки в R?

link <- "D:/temp/sample_data/0000098618-13-000011.htm"

Я хочу просто извлечь 0000098618-13-000011

То есть отбросить .htm и D:/temp/sample_data/ .

Я пробовал grep и gsub без особой удачи.

Ответ №1:

1) Используйте basename базовое имя, за которым следует sub :

 sub("\..*", "", basename(link))
## [1] "0000098618-13-000011"
  

2) file_path_sans_ext

 library(tools)
file_path_sans_ext(link)
## [1] "0000098618-13-000011"
  

3) sub

 sub(".*/(.*)\..*", "\1", link)
## [1] "0000098618-13-000011"
  

4) gsub

 gsub(".*/|\.[^.]*$", "", link)
## [1] "0000098618-13-000011"
  

5) strsplit

 sapply(strsplit(link, "[/.]"), function(x) tail(x, 2)[1])
## [1] "0000098618-13-000011"
  

6) прочитайте.таблицу. Если link это вектор, это будет работать только в том случае, если все элементы имеют одинаковое количество компонентов, разделенных /. Также предполагается, что единственная точка — это точка, разделяющая расширение.

 DF <- read.table(text = link, sep = "/", comment = ".", as.is = TRUE)
DF[[ncol(DF)]]
## [1] "0000098618-13-000011"
  

Комментарии:

1. Спасибо! что делает basename функция?

2. Или просто tools::file_path_sans_ext(basename("foo/bar/quux.html")) .

3. Это работает со всем набором данных, но basename для меня это ново.

4. Посмотрите на ?basename .

5. Или basename dirname комбинация: dirname(chartr(".", "/", basename(link)))

Ответ №2:

Используя stringr :

 library(stringr)
str_extract(link , "[0-9-] ")

# "0000098618-13-000011"