Как динамически извлекать символьную строку из символьного вектора r

#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")