#r #regex #extract
#r #регулярное выражение #извлечь
Вопрос:
Вот три символьных вектора:
[1] "Session_1/Focal_1_P1/240915_P1_S1_F1.csv"
[2] "Session_2/Focal_1_PA10/250915_PA10_S2_F1.csv"
[3] "Session_3/Focal_1_DA100/260915_DA100_S3_F1.csv"
Я пытаюсь извлечь строки P1
PA10
и DA100
, соответственно, стандартизированным способом (поскольку у меня есть несколько сотен других строк, из которых я хочу извлечь это.
Я знаю, что мне нужно использовать regex
, но я довольно новичок в этом и не совсем уверен, какой именно.
Я вижу, что общими являются 6 чисел ( dddddd
), за которыми следует an _
, а затем то, что я хочу, за которым следует другое _
.
Как мне извлечь то, что я хочу? Я верю, grep
но не на 100% в нужном мне регулярном выражении.
Ответ №1:
Мы можем использовать gsub
. Мы сопоставляем ноль или более символов ( .*
), за которыми следует косая черта ( \/
), за которой следуют одно или несколько чисел и символ подчеркивания ( \d _
), или ( !
) два экземпляра символа подчеркивания, за которыми следует один или несколько символов, которые не являются символом подчеркивания ( (_[^_] ){2}
), и заменяем его на пробел ( ""
).
gsub(".*\/\d _|(_[^_] ){2}", "", v1)
#[1] "P1" "PA10" "DA100"
Или мы извлекаем basename
из вектора, сопоставляем одно или несколько чисел, за которыми следует символ подчеркивания ( \d _
), за которым следует символ, не являющийся символом подчеркивания ( ([^_] )
), в качестве группы захвата, за которой следуют символы до конца строки, и заменяем его обратной ссылкой ( \1
) для захваченной группы.
sub("\d _([^_] ).*", "\1", basename(v1))
#[1] "P1" "PA10" "DA100"
данные
v1 <- c( "Session_1/Focal_1_P1/240915_P1_S1_F1.csv",
"Session_2/Focal_1_PA10/250915_PA10_S2_F1.csv",
"Session_3/Focal_1_DA100/260915_DA100_S3_F1.csv")