Нужна логика регулярных выражений

#r #regex

#r #регулярное выражение

Вопрос:

У меня есть вектор a следующим образом:

 a <- c("Rs. 360 Rs. 540 [-33% ]", "Rs. 213 Rs. 250 [-15% ]", "Rs. 430 Rs. 1030 [-58% ]")
  

Нужен ответ, как показано ниже:

a должен иметь Rs.360, Rs.213, Rs.430

Я использовал:

 a <- gsub(" Rs*", "", a)
  

Комментарии:

1. substr(a, 1, 7) или избавиться от пробела gsub("^(Rs.) (\d{3}). ", "\1\2", a)

2. Rs. Всегда ли в начале фиксированная строка? Всегда ли после него 3-значные числа?

Ответ №1:

Как я сказал в комментарии, вы можете использовать substr для извлечения начала строки, если у вас всегда один и тот же шаблон (одинаковое количество цифр). Вы можете дополнительно подавить пробел, если хотите:

 substr(a, 1, 7)
[1] "Rs. 360" "Rs. 213" "Rs. 430"
sub(" ", "", substr(a, 1, 7))
[1] "Rs.360" "Rs.213" "Rs.430"
  

Или вы можете захватить нужный шаблон в строке и сформировать другую строку только с этим:

 gsub("^[A-Za-z.]{3} (\d{3}). ", "Rs.\1", a)
[1] "Rs.360" "Rs.213" "Rs.430"
  

Здесь вы записываете только 3 цифры и явно возвращаете обратно Rs. .

Или вы можете «стереть» все, что вам не нужно: пространство и все, что идет после шаблона, который вы хотите сохранить:

 gsub("(\s)|([A-Za-z0-9. ]{8}\s\[-*\d %\s*\])", "", a)
[1] "Rs.360" "Rs.213" "Rs.430"
  

Здесь вы указываете, что хотите подавить пробел ( \s ) и / или 8 символов, которые являются либо буквенно-цифровыми, либо точкой, либо пробелом, за которыми следует пробел, открывающая скобка, ничего или знак минус, более одной цифры (цифр), знак%, ничего или пробел инаконец, закрывающая скобка.

Ответ №2:

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

 sub("^\s*(Rs\.)\s*(\d ).*", "\1\2", a)
  

Смотрите демонстрацию регулярных выражений

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

  • ^ — начало строки
  • \s* — ноль или более пробелов
  • (Rs\.) — Последовательность захвата группы 1 Rs.
  • \s* — 0 пробелов
  • (\d ) — Группа 2, содержащая 1 или более цифр
  • .* — остальная часть строки до ее конца

Протестированный код:

 > a <- c("Rs. 360 Rs. 540 [-33% ]", "Rs. 213 Rs. 250 [-15% ]", "Rs. 430 Rs. 1030 [-58% ]")
> sub("^\s*(Rs\.)\s*(\d ).*", "\1\2", a)
[1] "Rs.360" "Rs.213" "Rs.430"
  

Обновить

Для ввода, подобного a <- c(" 360 540", " 213 250") , используйте sub("^\D*(\d ).*", "\1", a) .

 > a <- c(" 360 540", " 213 250")
> sub("^\D*(\d ).*", "\1", a)
[1] "360" "213"
  

^\D*(\d ).* Сопоставляет любое количество нецифровых символов в начале строки, затем записывает 1 цифры в группу 1, а затем .* сопоставляет остальную часть строки.

Комментарии:

1. это не сработало для меня, так как в начале было дополнительное пространство .. я удалил другие вещи .. теперь вектор выглядит как <- (» 360 540″, » 213 250″).. мне нужны 360 и 213 … обратите внимание, что перед 360 и 213 есть пробел (т.е. в начале) .. поэтому нужно отбросить все после второго пробела..

2. Итак, Rs. это необязательно? Я изменил первоначальное предложение и добавил решение для новых строк, которые вы указали в комментарии выше.