2013-10-08 5 views
5

У меня есть строка, такие как "3.1 ml" или "abc 3.1 xywazw"Извлечение десятичных чисел из строки

я хотел бы, чтобы извлечь "3.1" из этой строки. Я нашел много вопросов о stackoverflow об извлечении чисел из символьной строки, но решение для десятичных чисел не работает.

ответ

10

Такой подход делает десятичную точку и десятичную дробь факультативным и позволяет несколько номеров, которые будут извлечены:

str <- " test 3.1 test 5" 
as.numeric(unlist(regmatches(str, 
          gregexpr("[[:digit:]]+\\.*[[:digit:]]*",str)) 
     )  ) 
#[1] 3.1 5.0 

Обеспокоенность отрицательных чисел может быть адрес с опциональным Perl стиль заглядывая вперёд:

str <- " test -4.5 3.1 test 5" 
    as.numeric(unlist(regmatches(str,gregexpr("(?>-)*[[:digit:]]+\\.*[[:digit:]]*",str, perl=TRUE)))) 

#[1] -4.5 3.1 5.0 
+0

Действительно, он работает во многих ситуациях, фантастический! –

+0

Отредактировано. Раньше был неправильный квантификатор повторений. –

+0

Справа. Спасибо за исправление. –

9

Используйте stringr библиотеку:

x<-"abc 3.1 xywazw" 
str_extract(x, "\\d+\\.*\\d*") 
[1] "3.1" 
+7

Возможно использовать '' \\ d + \\. \\ d + "' –

+0

Спасибо. @RicardoSaporta прав. Например, это не работает для 13.1. –

+1

И никто не будет работать на «10». Я не думаю, что «+» является правильным квантором повторения для использования для второго или третьего выражений. –

1

Вы можете использовать регулярные выражения:

> str <- " test 3.1 test" 
> as.numeric(regmatches(str,regexpr("[[:digit:]]+\\.[[:digit:]]+",str))) 
[1] 3.1 

regexpr возвращает позицию начала и длину совпавшей строки. regmatches возвращает матчи. Затем вы можете преобразовать его в число.

+0

Моя позиция была заблокирована. Я попытался изменить ее, когда понял "" использовалось ненадлежащим образом. Его нужно избегать. Возможно, вы можете исправить эту ошибку, и тогда надзапись будет заработана. –

+0

@DWin Если вы вводите текст «test 3p1 test», например, он не сопоставляется. Поэтому я не уверен "." нужно избегать здесь. –

+0

«3p1» сопоставляется, но затем преобразуется в NA с помощью 'as.numeric'. –

2

Регулярное выражение для числа с плавающей запятой от http://www.regular-expressions.info/floatingpoint.html с незначительной корректировкой для работы в R.

s <- "1e-6 dkel" 
regmatches(s,gregexpr("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?",s)) 
> [[1]] 
> [1] "1e-6" 
Смежные вопросы