Как сопоставить несколько групп захвата с помощью str_match(, regex)

Я использую str_match из пакета stringr для захвата текста между скобками.

library(stringr)

strs = c("P5P (abcde) + P5P (fghij)", "Glcext (abcdef)")
str_match(strs, "\\(([a-z]+)\\)")

дает мне только совпадения "abcde" и "abcdef". Как я могу также захватить "fghij", используя одно и то же регулярное выражение для обеих строк?


person user1981275    schedule 18.01.2013    source источник
comment
Делает ли str_match_all(strs, "\\(([a-z]+)\\)") то, что вы хотите?   -  person Josh O'Brien    schedule 18.01.2013
comment
Работает отлично, спасибо! я не знал об этом, потому что он не был связан в разделе «Смотрите также:» на странице справки...   -  person user1981275    schedule 18.01.2013
comment
Это было бы хорошим дополнением к файлу справки. По моему опыту, часто стоит попробовать что-то вроде этого, чтобы увидеть, что еще доступно: ls("package:stringr").   -  person Josh O'Brien    schedule 18.01.2013


Ответы (1)


str_extract_all(strs, "\\(([a-z]+)\\)")

или, как упоминает @JoshO'Brien в своем комментарии,

str_match_all(strs, "\\(([a-z]+)\\)")

Это можно так же легко выполнить с помощью базы R:

regmatches(strs, gregexpr("\\(([a-z]+)\\)", strs))
person Matthew Plourde    schedule 18.01.2013
comment
Хорошо работает, спасибо. Но почему при «регматчах» захватываются и скобки? - person user1981275; 18.01.2013
comment
str_match_all возвращает как совпадения, так и группы в ваших совпадениях. str_extract_all и regmatches/gregexpr возвращают только совпадения. Если вы хотите, чтобы эти методы last to возвращали только то, что вместо (), используйте pat = "(?<=\\()[a-z]+(?=\\))" с str_extract_all(strs, perl(pat)) или regmatches(strs, gregexpr(pat, strs, perl=TRUE)). Этот шаблон использует утверждения вперед и назад. См. конец раздела Perl в ?regex для более подробной информации о том, что здесь происходит. - person Matthew Plourde; 18.01.2013