2012-03-20 61 views
3

POSIX表達式讓我頭疼。從字符串中提取數字和名稱[r]

假設我們有一個字符串:

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

最終我想能夠有:

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

我有一個看看stringr包,但無法弄清楚如何使用正則表達式提取信息,並使用str_split

任何幫助將不勝感激。

卡梅倫

+2

是否所有行都有這種格式? – 2012-03-21 00:19:58

+0

是的,但內容可能不同,即''[question(37),question_pipe(\'Cam B \')]'' 它是從surveygizmo響應數據的JSON數據中提取的 – 2012-03-21 00:49:16

回答

3

所以,如果我理解正確的要提取的括號內的元素。

你可以先提取那些元素,包括括號,使用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

這對我來說很有用,謝謝。但是,你如何刪除「\」以及額外的「從人10的末尾? – 2012-03-21 00:56:33

+0

啊,它得到了'gsub(」\「」,「,b3)'謝謝你的幫助flodel :) – 2012-03-21 01:04:04

+0

這是更多簡潔:b1 < - unlist(str_extract_all(string = a,pattern =「\\(。*?\\)」)); b < - gsub(「[[:punct:]]」,「」,b1) – Kay 2012-03-21 15:41:20

3

這應該在你工作的具體情況:

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" 
0

我會做這種方式:

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

擴展flodel的答案 - 這將是最簡潔的解決方案,我認爲:

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