2016-01-15 3 views
2
пробелы

Вот вещь:R regmatches() и stringr str_extract() тащат вдоль

test=" 2 15 3 23 12 0 0.18" 
#I want to extract the 1st number separately 
pattern="^ *(\\d+) +" 

d=regmatches(test,gregexpr(pattern,test)) 
> d 
[[1]] 
[1] " 2 " 

library(stringr) 
f=str_extract(test,pattern) 
> f 
[1] " 2 " 

Они оба приносят пробельные к результату, несмотря на использование() -brackets. Зачем? Скобки предназначены для указания, какая часть согласованного шаблона вы хотите, я не прав? Я знаю, что могу обрезать их trimws() или принудить их непосредственно к цифровым, но мне интересно, не понял ли я какую-то механику шаблонов.

+1

Пожалуй , вам нужно 'str_match_all'. –

+0

Если вы используете 'f = str_match (test, pattern)', 'f [[2]]' будет содержать '2' –

+0

@stribizhev Да, это работает, спасибо.Итак, 'str_extract()' и 'regmatches()' просто не поддерживают группы захвата? – ephemeris

ответ

2

Использование str_match (или str_match_all)

Так как вы хотите, чтобы извлечь захвата группы, вы можете использовать str_match (или str_match_all). str_extract только выдержки всего совпадения.

От R stringr help:

str_matchExtract соответствует группе из строки.

и

str_extract извлечь полный матч

R Код:

library(stringr) 
test=" 2 15 3 23 12 0 0.18" 
pattern="^ *(\\d+) +" 
f=str_match(test,pattern) 
f[[2]] 
## [1] "2" 

f[[2]] будет выводить второй элемент, который является первым захват группа стоимость.

Использование regmatches

Как упоминается в comment above, также возможно с regmatches и regexec:

test=" 2 15 3 23 12 0 0.18" 
pattern="^ *(\\d+) +" 
res <- regmatches(test,regexec(pattern,test)) 
res[[1]][2] // The res list contains all matches and submatches 
## [1] "2" // We get the item[2] from the first match to get "2" 

См regexec help page, который говорит:

regexec возвращает список такая же длина, как текст, каждый элемент которого равен -1, если нет совпадения, или последовательность целых чисел с начальными позициями совпадения и все подстроки, соответствующие подвыражениям в скобках шаблона, с атрибутом «match.length» вектор, дающий длину совпадений (или -1 для не совпадает).

OP задача конкретное решение

На самом деле, так как вы заинтересованы только в 1 целое число в начале строки, вы можете добиться того, что вы хотите с простым gsub:

> gsub("^ *(\\d+) +.*", "\\1", test) 
[1] "2" 
+0

Поскольку вы используете'^'(таким образом, привязывая шаблон), вы получите 1 совпадение, даже если вы используете' str_match_all ', поэтому я использовал' str_match' в ответе. –

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