Извлечь из первых квадратных скобок - PullRequest
0 голосов
/ 29 августа 2018

Я знаю, что есть несколько похожих вопросов, но они не помогли мне, возможно, из-за моего непонимания основ работы со строками.

У меня есть кусок строки, который я хочу извлечь из его первых квадратных скобок.

x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"

Я просмотрел весь интернет, чтобы собрать следующий код, но он дает мне 2-ую скобку

sub(".*\\[(.*)\\].*", "\\1", x, perl=TRUE)

Код возвращает 2 . Я ожидаю получить 4 .

Буду признателен, если кто-то укажет на недостающую часть.

---- обновление ----

Замена .* на .*? в первых двух экземплярах сработала, но не знаю как. Я оставляю вопрос открытым для тех, кто может объяснить, почему это работает:

sub(".*?\\[(.*?)\\].*", "\\1", x, perl=TRUE)

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Ты почти там:

sub("^[^\\]]*\\[(\\d+)\\].*", "\\1", x, perl=TRUE)
## [1] "4"

Первоначальная проблема заключается в том, что .* соответствует как можно большему количеству всего, прежде чем оно совпадет с [. Ваше решение было *?, то есть ленивая версия * (не жадная, неохотная) соответствует как можно меньше.

Полностью действительный, я использовал еще одну альтернативу [^\\]]*: она переводит в соответствие все, что не ].

0 голосов
/ 29 августа 2018

stringr

Вы можете решить это с помощью базы R, но я обычно предпочитаю функции из пакета stringr при решении таких «проблем».

x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"

Если вы хотите использовать только первую строку в скобках, используйте str_extract:

stringr::str_extract(x, "(?<=\\[).+?(?=\\])")
# [1] "4"

Если вы хотите, чтобы все строки были в скобках, используйте str_extract_all:

stringr::str_extract_all(x, "(?<=\\[).+?(?=\\])")
# [[1]]
# [1] "4" "2" 
...