Использование gsub для замены последнего вхождения строки в R - PullRequest
0 голосов
/ 16 февраля 2019

У меня следующий символьный вектор, который мне нужно изменить с помощью gsub.

strings <- c("x", "pm2.5.median", "rmin.10000m", "rmin.2500m", "rmax.5000m")

Требуемый выход фильтруемого strings:

"x", "pm2.5.median", "rmin", "rmin", "rmax"

Моя текущая попытка работает длявсе, кроме строки pm2.5.median, в которой есть точки, которые необходимо сохранить.Я просто пытаюсь удалить размер буфера, который добавляется в конец каждой переменной, например 1000m, 2500m, 5000m, 7500m и 10000m.

gsub("\\..*m$", "", strings)
"x", "pm2", "rmin", "rmin", "rmax"

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Шаблон .* соответствует любому 0 или более символам, как можно большему.Шаблон \..*m$ соответствует первому (крайнему левому) . в строке, а затем захватывает весь текст после него, если он заканчивается на m.

. Вам нужно

> sub("\\.[^.]*m$", "", strings)
[1] "x"            "pm2.5.median" "rmin"         "rmin"         "rmax" 

Здесь \.[^.]*m$ соответствует ., затем 0 или более символов, отличных от точки, а затем m в конце строки.

См. regex demo .

Подробности

  • \. - точка (необходимо экранировать, так как в противном случае это специальный символ регулярного выражения)
  • [^.]* - отрицательный класс символов, соответствующий любому символу, но . 0 или более раз
  • m - m char
  • $ - конец строки.
0 голосов
/ 16 февраля 2019

Сопоставьте точку, любое количество цифр, m и конец строки и замените ее пустой строкой.Обратите внимание, что мы предпочитаем от sub до gsub, потому что нас интересует только одна замена на строку.

sub("\\.\\d+m$", "", strings)
## [1] "x"            "pm2.5.median" "rmin"         "rmin"         "rmax"   
...