POSIX表達式讓我頭疼。從字符串中提取數字和名稱[r]
假設我們有一個字符串:
a = "[question(37), question_pipe(\"Person10\")]"
最終我想能夠有:
b = c("37", "Person10")
我有一個看看stringr
包,但無法弄清楚如何使用正則表達式提取信息,並使用str_split
。
任何幫助將不勝感激。
卡梅倫
POSIX表達式讓我頭疼。從字符串中提取數字和名稱[r]
假設我們有一個字符串:
a = "[question(37), question_pipe(\"Person10\")]"
最終我想能夠有:
b = c("37", "Person10")
我有一個看看stringr
包,但無法弄清楚如何使用正則表達式提取信息,並使用str_split
。
任何幫助將不勝感激。
卡梅倫
所以,如果我理解正確的要提取的括號內的元素。
你可以先提取那些元素,包括括號,使用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\""
編輯:關於正則表達式模式的幾點意見:\\(
和\\)
是您的開始和結束括號。 .*?
表示任何字符串,但不會貪婪,否則您會從第一個(
到最後一個)
獲得一個長匹配。
這對我來說很有用,謝謝。但是,你如何刪除「\」以及額外的「從人10的末尾? – 2012-03-21 00:56:33
啊,它得到了'gsub(」\「」,「,b3)'謝謝你的幫助flodel :) – 2012-03-21 01:04:04
這是更多簡潔:b1 < - unlist(str_extract_all(string = a,pattern =「\\(。*?\\)」)); b < - gsub(「[[:punct:]]」,「」,b1) – Kay 2012-03-21 15:41:20
這應該在你工作的具體情況:
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"
我會做這種方式:
a <- "[question(37), question_pipe(\"Person10\")]"
b <- unlist(strsplit(gsub("\"","",gsub(".*question\\((.*)\\).*question_pipe\\((.*)\\).*","\\1,\\2",a)),","))
print(b)
[1] "37" "Person10"
擴展flodel的答案 - 這將是最簡潔的解決方案,我認爲:
a <- "[question(37), question_pipe(\"Person10\")]"
b1 <- unlist(str_extract_all(string = a, pattern = "\(.*?\)"))
b <- gsub("[[:punct:]]", "", b1)
是否所有行都有這種格式? – 2012-03-21 00:19:58
是的,但內容可能不同,即''[question(37),question_pipe(\'Cam B \')]'' 它是從surveygizmo響應數據的JSON數據中提取的 – 2012-03-21 00:49:16