Извлечь строку между/

Если у меня есть эти строки:

mystrings <- c("X2/D2/F4",
               "X10/D9/F4",
               "X3/D22/F4",
               "X9/D22/F9")

Как извлечь 2,9,22,22. Эти символы находятся между / и после первого символа в /.

Я хотел бы сделать это в векторном виде и добавить новый столбец с transfrom, если возможно, с которым я знаком.

Я думаю, что это регулярное выражение вызывает меня где-то рядом со всеми символами внутри \:

^.*\\'(.*)'\\.*$

Ответы

Ответ 1

as.numeric(gsub("^.*D([0-9]+).*$", "\\1", mystrings))

Ответ 2

> gsub("(^.+/[A-Z]+)(\\d+)(/.+$)", "\\2", mystrings)
[1] "2"  "9"  "22" "22"

Вы бы "прочитали" (или "разобрали" ) этот шаблон регулярного выражения, разделив любую согласованную строку на три части:

1) все, вплоть до первой косой черты с последующей последовательностью заглавных букв,

2) любые цифры (= "\ d" ) в последовательности перед следующей косой чертой и

3) со следующего слэша до конца.

И тогда только возврат второй части....

Неподписанные строки символов будут возвращены без изменений.

Ответ 3

@Арун украл мой гром, поэтому я даю свой первоначальный длинный пример.

cut.to.pieces <- strsplit(mystrings, split = "/")
got.second <- lapply(cut.to.pieces, "[", 2)
get.numbers <- unlist(got.second)
as.numeric(gsub(pattern = "[[:alpha:]]", replacement = "", x = get.numbers, perl = TRUE))
[1]  2  9 22 22

Ответ 4

Используя str_extract из пакета stringr:

as.numeric(str_extract(mystrings, perl('(?<=/[A-Z])[0-9]+(?=/)')))

Ответ 5

Это оказалось компактной версией ответа @RomanLuštrik:

gsub("[^0-9]","",sapply(strsplit(mystrings,"/"),"[",2))
[1] "2"  "9"  "22" "22"

Ответ 6

Использование rex может сделать этот тип задачи немного проще.

matches <- re_matches(mystrings,
  rex(
    "/",
    any,
    capture(name = "numbers", digits)
    )
  )

as.numeric(matches$numbers)
#>[1]  2  9 22 22