извлечение части пути с использованием суб - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь извлечь имя файла из пути в r.В строке типа

someurl.com/vp/125514_45147_55144.jpg?_nc25244

я хочу извлечь 125514_45147_55144

Я использую следующее выражение:

 sub(".*vp/(.*?)/.*", "\\1", input) 

, которое работает, но также удаляет подчеркивания:

1255144514755144

Я не могу понять, как сохранить подчеркивание

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

Вдохновленный ответом @ G.Grothendieck, решения без регулярных выражений, использующего dirname, basename и chartr

x = 'someurl.com/vp/125514_45147_55144.jpg?_nc25244'
dirname(chartr(x = basename(x), ".", "/"))
# [1] "125514_45147_55144"

Предполагая, что в имени файла нет точки.

0 голосов
/ 14 февраля 2019

stringr альтернатива

library( stringr )
str_match( "someurl.com/vp/125514_45147_55144.jpg?_nc25244", "^.*/(.*?)\\..*$" )[[2]]
#[1] "125514_45147_55144"
0 голосов
/ 14 февраля 2019

Удалить точку и все после нее базового имени:

sub("\\..*", "", basename(x))
## [1] "125514_45147_55144"

Если возможно, что в имени файла есть точки, используйте этот немного более сложный шаблон:

sub("(.*)\\..*", "\\1", basename(x))
## [1] "125514_45147_55144"
0 голосов
/ 13 февраля 2019

Я предлагаю исправить это как

sub(".*/vp/([^/?]*?)\\.[^/?.]*(?:\\?.*)?$", "\\1", input)

См. Демоверсию regex

Подробности

  • .* - любые 0+ символов как можно больше
  • /vp/ - литеральная подстрока
  • ([^/?]*?) - группа 1 (на его захваченное значение ссылается \1 из шаблона замены): любые 0+ символов, кроме / и ?, как можно меньше
  • \\. - точка
  • [^/?.]* - 0+ символов, кроме ., ? и /
  • (?:\\?.*)? - необязательная подстрока, соответствующая ?, а затем любые 0+ символов, как можно больше
  • $ - конец строки.

При regmatches / regexec рисунок становится намного более четким:

x <- "someurl.com/vp/125514_45147_55144.jpg?_nc25244"
regmatches(x,regexec("/vp/([^/?]*)\\.",x))[[1]][2]
## => [1] "125514_45147_55144"

См. Демонстрационную версию R

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...