Ответ 1
as.numeric(gsub("^.*D([0-9]+).*$", "\\1", mystrings))
Если у меня есть эти строки:
mystrings <- c("X2/D2/F4",
"X10/D9/F4",
"X3/D22/F4",
"X9/D22/F9")
Как извлечь 2,9,22,22
. Эти символы находятся между /
и после первого символа в /
.
Я хотел бы сделать это в векторном виде и добавить новый столбец с transfrom
, если возможно, с которым я знаком.
Я думаю, что это регулярное выражение вызывает меня где-то рядом со всеми символами внутри \
:
^.*\\'(.*)'\\.*$
as.numeric(gsub("^.*D([0-9]+).*$", "\\1", mystrings))
> gsub("(^.+/[A-Z]+)(\\d+)(/.+$)", "\\2", mystrings)
[1] "2" "9" "22" "22"
Вы бы "прочитали" (или "разобрали" ) этот шаблон регулярного выражения, разделив любую согласованную строку на три части:
1) все, вплоть до первой косой черты с последующей последовательностью заглавных букв,
2) любые цифры (= "\ d" ) в последовательности перед следующей косой чертой и
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
Используя str_extract
из пакета stringr
:
as.numeric(str_extract(mystrings, perl('(?<=/[A-Z])[0-9]+(?=/)')))
Это оказалось компактной версией ответа @RomanLuštrik:
gsub("[^0-9]","",sapply(strsplit(mystrings,"/"),"[",2))
[1] "2" "9" "22" "22"
Использование rex может сделать этот тип задачи немного проще.
matches <- re_matches(mystrings,
rex(
"/",
any,
capture(name = "numbers", digits)
)
)
as.numeric(matches$numbers)
#>[1] 2 9 22 22