Извлечение всех чисел в строке, окруженных определенным шаблоном в R - PullRequest
2 голосов
/ 27 мая 2020

Я хотел бы извлечь все числа в строке, окруженные двумя маркерами / образцами. Однако регулярные выражения в R - моя проклятие.

У меня есть что-то вроде этого:

string  <- "<img src='images/stimuli/32.png' style='width:341.38790035587186px;height: 265px;'><img src='images/stimuli/36.png' style='width:341.38790035587186px;height: 265px;'>"
marker1 <- "images/stimuli/"
marker2 <- ".png"

и хочу что-то вроде этого

gsub(paste0(".*", marker1, "*(.*?) *", marker2, ".*"), "\\1", string)

[1] "32" "36"

Однако я получаю это:

[1] "32"

PS Если у кого-то есть хорошее руководство, чтобы понять, как здесь работают регулярные выражения, дайте мне знать. Я почти уверен, что ответ довольно прост, но я просто не получаю регулярное выражение: (

Ответы [ 2 ]

4 голосов
/ 27 мая 2020

Вы можете использовать

string  <- "<img src='images/stimuli/32.png' style='width:341.38790035587186px;height: 265px;'><img src='images/stimuli/36.png' style='width:341.38790035587186px;height: 265px;'>"
regmatches(string, gregexpr("images/stimuli/\\K\\d+(?=\\.png)", string, perl=TRUE))[[1]]
# => [1] "32" "36"

ПРИМЕЧАНИЕ : Если может быть что угодно, а не только числа, вы можете заменить \\d+ на .*?.

См. Демонстрацию R и regex demo .

regmatches with gregexpr извлекает все совпадения, найденные во входных данных.

регулярное выражение соответствует:

  • images/stimuli/ - буквальная строка
  • \K - оператор сброса совпадения, отбрасывающий весь текст, сопоставленный на данный момент
  • \d+ - 1 + цифры
  • (?=\.png) - подстрока .png (. - специальный символ, его нужно экранировать).
1 голос
/ 27 мая 2020

Вы можете использовать str_extract из пакета stringr:

library(stringr)
str_extract_all(string, "(?<=images/stimuli/)\\d+(?=\\.png)")
[[1]]
[1] "32" "36"

Это решение использует положительный просмотр назад, (?<=images/stimuli/), и положительный просмотр вперед, (?=\\.png), которые не являются захватывающими группами. , а вместо этого соответствует одному или нескольким числам \\d+, находящимся между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...