2016-07-08 9 views
-3
st = list("amber johnson", "anhar link ari") 
t = str_match_all(st, "(\\ba[a-z]+\\b)") 
str(t) 
# List of 2 
# $ : chr [1, 1:2] "amber" "amber" 
# $ : chr [1:2, 1:2] "anhar" "ari" "anhar" "ari" 

Почему результаты повторяются так же?Объясните поведение `` `` str_match_all``` в пакете R `` `stringr```

+0

ли это бег без ошибок? 'str_match_all' принимает строку в качестве первого аргумента ... при запуске строки 2 результат« Ошибка: строка должна быть атомным вектором » – copeg

+0

@copeg для меня работает без ошибок. – tnabdb

+0

@copeg - Возможно, вы используете старую версию * stringr *. Работает для меня в версии 1.0.0 –

ответ

3

Если посмотреть на ?str_match_all значении, он говорит:

For str_match, a character matrix. First column is the complete match, followed by one column for each capture group. For str_match_all, a list of character matrices.

Поскольку вы шаблон содержит захват группу, результат содержит два столбца, один для полного матча один для группы захвата. Если вы не хотите, повторяющуюся колонки, вы можете удалить скобки группы из шаблона:

st = list("amber johnson", "anhar link ari") 
t = str_match_all(st, "\\ba[a-z]+\\b") 
str(t) 

Что дает:

# List of 2 
# $ : chr [1, 1] "amber" 
# $ : chr [1:2, 1] "anhar" "ari" 
+3

Если нет групп захвата, вообще нет необходимости в 'str_match_all',' str_extract_all' достаточно или даже использовать 'gregexpr' с' regmatches'. –

+0

@Psidom, Ах, я вижу ... Я прочитал справочную страницу, но не понял, что результат содержит полную группу и группу захвата. Благодарю. – tnabdb