Вы можете использовать
x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/\\K[^_]+", x, perl=TRUE))
## [1] "556662"
См. regex и R demo .
Здесь регулярное выражение соответствует и выводит первую подстрокукоторая соответствует
.*/
- любые 0+ символов, как можно больше до последнего /
\K
- пропускает эту часть из матча [^_]+
- ставит 1 или более символов, отличных от _
, в значение совпадения.
Или sub
решение:
sub(".*/([^_]+).*", "\\1", x)
См. regex demo .
Здесь оно аналогично предыдущему, но 1 или более символов, отличных от _
, включены в группу 1 (\1
в шаблоне замены) и завершающий .*
убедитесь, что весь вход согласован (и использован, готов к замене).
Альтернативные неосновные решения R
Если вы можете позволить себе или предпочитаете работать с stringi
, вы можете использовать
library(stringi)
stri_match_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", ".*/([^_]+)")[,2]
## [1] "556662"
Это будет соответствовать строке до последнего /
и попадет в Группу 1 (к которой вы обращаетесь вколонка2 с использованием [,2]
) 1 или более символов, отличных от _
.
или
stri_extract_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", "(?<=/)[^_/]+")
## => [1] "556662"
Это извлечет последнее совпадение строки, состоящей из 1 или более символов, отличных от_
и /
после /
.