#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\.)
— Последовательность захвата группы 1Rs.
\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.
это необязательно? Я изменил первоначальное предложение и добавил решение для новых строк, которые вы указали в комментарии выше.