Извлечение номера и имени из строки [r] - PullRequest
3 голосов
/ 21 марта 2012

POSIX Expression вызывает у меня головную боль.

Допустим, у нас есть строка:

a = "[question(37), question_pipe(\"Person10\")]"

и в конечном итоге я бы хотел иметь:

b = c("37", "Person10")

Я посмотрел на пакет stringr, но не могу понять, как извлечь информацию, используя регулярные выражения и str_split.

Любая помощь будет принята с благодарностью.

Cameron

Ответы [ 4 ]

3 голосов
/ 21 марта 2012

Это должно работать в вашем конкретном случае:

a <- "[question(37), question_pipe(\"Person10\")]"

# First split into two parts
b <- strsplit(a, ",")[[1]]

# Extract the number (skip as.integer if you want it as character)
x <- as.integer(gsub("[^0-9]","", b[[1]])) # 37

# Extract the stuff in quotes
y <- gsub(".*\"(.*)\".*", "\\1", b[[2]])   # "Person10"

Альтернатива для извлечения всего в скобках из первой части:

x <- gsub(".*\\((.*)\\).*", "\\1", b[[1]]) # "37"
3 голосов
/ 21 марта 2012

Так что, если я правильно понимаю, вы хотите извлечь элементы в скобках.

Вы можете сначала извлечь эти элементы, включая скобки, используя str_extract_all:

b1 <- str_extract_all(string = a, pattern = "\\(.*?\\)")
b1
# [[1]]
# [1] "(37)"           "(\"Person10\")"

Поскольку str_extract_all возвращает список, давайте превратим его в вектор:

b2 <- unlist(b1)
b2
# [1] "(37)"           "(\"Person10\")"

Наконец, вы можете удалить круглые скобки (первый и последний символ каждой строки), используя str_sub:

b3 <- str_sub(string = b2, start = 2L, end = -2L) 
b3
# [1] "37"           "\"Person10\""

Редактировать: Несколько комментариев о шаблоне регулярных выражений: \\( и \\) - ваши открывающая и закрывающая скобки. .*? означает любую строку символов, но без жадности, в противном случае вы получите одно длинное совпадение от первого ( до последнего ).

0 голосов
/ 23 марта 2012

расширение ответа Флоделя - это было бы самое краткое решение, я думаю:

a <- "[question(37), question_pipe(\"Person10\")]"    
b1 <- unlist(str_extract_all(string = a, pattern = "\(.*?\)"))
b <- gsub("[[:punct:]]", "", b1)
0 голосов
/ 21 марта 2012

Я бы сделал это так:

a <- "[question(37), question_pipe(\"Person10\")]"
b <- unlist(strsplit(gsub("\"","",gsub(".*question\\((.*)\\).*question_pipe\\((.*)\\).*","\\1,\\2",a)),","))
print(b)
[1] "37"       "Person10"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...