2016-03-19 3 views
-1

У меня есть длинные строки, содержащие различные текстовые и числовые данные, как этотGrep поплавок с знаком процента в R

a <- "$3,295,000; 8 Units; 4.08% Cap Rate; 9,360 SF Bldg;"

, и я хотел бы быть в состоянии извлечь процент, в этом случае 4.08%.

Как я могу сопоставить этот шаблон с grep()?

+2

Повеселиться с ним 'сканирования (текст = а то, что = "" , sep = ";", comment.char = "C", strip.white = TRUE) [3] ', haha ​​ –

+0

Или' scan (text = a, what = "", sep = "") [4] ' –

ответ

3

Вы можете использовать не жадный матч в sub для этого:.

sub('.*?([0-9.]+%).*', '\\1', a) 
[1] "4.08%" 

Это соответствует только первый экземпляр шаблона в строке

.*? не является жадным, поэтому он не будет «всасывать» символы в следующем шаблоне, который соответствует тому, что вы хотите.

1

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

library(stringr) 
str_extract_all(a, "[0-9.]+%")[[1]] 
#[1] "4.08%" 

Если нам нужно только, чтобы соответствовать первой инстанции, используйте str_extract вместо str_extract_all. Хотя другой ответ также делает то же самое, лучше использовать str_extract_all для нескольких случаев.


grep используются для возврата индекса строки, имеет ли он конкретный шаблон или нет. Предположим, что, если мы используем grep, он возвращает индекс как 1 (так как существует только один элемент в vector и она соответствует шаблону)

grep("[0-9.]+$", a) 
#[1] 1 

Для извлечения подстроки либо str_extract или gsub (от base R могут быть использованы.

1

Узор вы должны использовать это (?:[0-9]{1,2}(?:\.[0-9]{1,2})?%)

Это соответствует Upto 2 digits.Upto 2 digits%

Regex101 Demo

Смежные вопросы