Извлечение символов между первым и третьим периодом - PullRequest
2 голосов
/ 10 января 2020

В основном, как говорится в заголовке, у меня есть вектор строк символов, и для каждого элемента я хочу извлечь все между первым и третьим периодом. Например,

s <- c("random.0.0.word.1.0", "different.0.02.words.15.6", "different.0.1.words.4.2")

Результат должен быть таким:

"0.0" "0.02" "0.1" 

Я попытался адаптировать код из здесь и здесь , но не смог. Любой совет высоко ценится!

Ответы [ 4 ]

2 голосов
/ 10 января 2020

Мы можем захватить как группу путем сопоставления символов, отличных от . ([^.]+) от начала (^) строки, за которыми следует точка (\\.), а затем захватить все символы между первую и третью точку, при замене используйте обратную ссылку (\\1) захваченной группы ((...))

sub("^[^.]+\\.([^.]+\\.[^.]+)\\..*", "\\1", s)
#[1] "0.0"  "0.02" "0.1" 

Или это также можно сделать с помощью substr после получение положения точек

lst1 <- gregexpr('.', s, fixed = TRUE)
substring(s, sapply(lst1, `[`, 1) + 1, sapply(lst1, `[`, 3) - 1)
#[1] "0.0"  "0.02" "0.1" 
1 голос
/ 16 января 2020

Вот способ с unglue , который некоторым может показаться менее пугающим:

library(unglue)
s <- c("random.0.0.word.1.0", "different.0.02.words.15.6", "different.0.1.words.4.2")
unglue_vec(s, "{=[^.]+}.{x}.{=[^.]+}.{=[^.]+}.{=[^.]+}")
#> [1] "0.0"  "0.02" "0.1"

Создано в 2020-01-16 пакетом Представить (v0.3.0)

Подшаблоны [^.]+ являются последовательностями "не точек", без имен (ничего в lhs =), потому что мы не хотим их извлекать.

1 голос
/ 10 января 2020

Мы можем использовать sub, чтобы захватить как можно меньше между 1-м и 3-м периодом.

sub(".*?\\.(.*?\\..*?)\\..*", "\\1", s)
#[1] "0.0"  "0.02" "0.1" 
1 голос
/ 10 января 2020

Альтернативный способ сделать это, без использования каких-либо необычных функций регулярных выражений, это просто разделить на . и затем взять нужные нам биты:

library(stringr)
library(purrr)

str_split(s, "\\.") %>% 
  map_chr(~ paste0(.[2:3], collapse = "."))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...