Извлечение номера и имени из строки [r]

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

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

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

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

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

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

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

Кэмерон


person Cam B    schedule 20.03.2012    source источник
comment
Все ли строки имеют этот формат?   -  person Tyler Rinker    schedule 21.03.2012
comment
Да, но содержимое может быть другим, например '[question(37), question_pipe(\Cam B\)]'. Оно извлечено из данных JSON из данных ответа Surveygizmo.   -  person Cam B    schedule 21.03.2012


Ответы (4)


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

Вы можете сначала извлечь эти элементы, включая круглые скобки, используя 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\""

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

person flodel    schedule 21.03.2012
comment
Это сработает для меня, спасибо. Но как бы вы удалили \, а также лишнее с конца от человека 10? - person Cam B; 21.03.2012
comment
Ах, понял gsub("\"", "", b3) Спасибо за помощь, флодель :) - person Cam B; 21.03.2012
comment
это более кратко: b1 ‹- unlist(str_extract_all(string = a, pattern = \(.*?\))); b ‹- gsub([[:punct:]], , b1) - person Kay; 21.03.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"
person Tommy    schedule 21.03.2012

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

a <- "[question(37), question_pipe(\"Person10\")]"
b <- unlist(strsplit(gsub("\"","",gsub(".*question\\((.*)\\).*question_pipe\\((.*)\\).*","\\1,\\2",a)),","))
print(b)
[1] "37"       "Person10"
person Hansi    schedule 21.03.2012

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

a <- "[question(37), question_pipe(\"Person10\")]"    
b1 <- unlist(str_extract_all(string = a, pattern = "\(.*?\)"))
b <- gsub("[[:punct:]]", "", b1)
person Kay    schedule 23.03.2012